本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2024-11(3)

视频技术处理之javaCV视频图像灰度处理,附代码

发布于2021-05-29 20:13     阅读(590)     评论(0)     点赞(18)     收藏(0)


图片灰度处理效果

视频灰度处理效果

javacv 视频图片灰度处理

 

Java spring boot项目或者maven项目的pom文件中添加以下依赖  

  1. <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
  2. <dependency>
  3. <groupId>org.bytedeco</groupId>
  4. <artifactId>javacv-platform</artifactId>
  5. <version>1.5.5</version>
  6. </dependency>

 核心代码,单类实现,idea创建VideoGrayProcessor 类,复制粘贴下面代码,右键点击run运行主方法即可。

图像灰度算法

  1. 取得每一个像素的red,green,blue值。

  2. 使用灰度算法,算出一个灰度值。

  3. 用这个灰度值代替像素原始的red,green,blue值。

比如我们的灰度算法是:

Gray = (Red + Green + Blue) / 3

主要有图片文字水印和视频水印两个方法,大家可以根据自己的的需求对方法里的参数修改。

  1. import org.bytedeco.javacv.FFmpegFrameGrabber;
  2. import org.bytedeco.javacv.FFmpegFrameRecorder;
  3. import org.bytedeco.javacv.Frame;
  4. import org.bytedeco.javacv.Java2DFrameConverter;
  5. import javax.imageio.ImageIO;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. public class VideoGrayProcessor {
  10. final static String videoFolderPath = "C:/Users/tarzan/Desktop/video/";
  11. final static String videoName = "video.mp4";
  12. final static String imageFolderPath = "C:/Users/tarzan/Desktop/image/";
  13. final static String imageName = "logo.jpg";
  14. public static void main(String[] args) throws Exception {
  15. videoProcess(videoFolderPath + videoName);
  16. imageProcess(imageFolderPath + imageName);
  17. }
  18. //视频水印
  19. public static void videoProcess(String filePath) {
  20. //抓取视频图像资源
  21. FFmpegFrameGrabber videoGrabber = new FFmpegFrameGrabber(filePath);
  22. //抓取视频图像资源
  23. FFmpegFrameGrabber audioGrabber = new FFmpegFrameGrabber(filePath);
  24. try {
  25. videoGrabber.start();
  26. audioGrabber.start();
  27. FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFolderPath + "new" + videoName, videoGrabber.getImageWidth(), videoGrabber.getImageHeight(), videoGrabber.getAudioChannels());
  28. recorder.start();
  29. //处理图像
  30. int videoSize = videoGrabber.getLengthInVideoFrames();
  31. for (int i = 0; i < videoSize; i++) {
  32. Frame videoFrame = videoGrabber.grabImage();
  33. if (videoFrame != null && videoFrame.image != null) {
  34. System.out.println("视频共" + videoSize + "帧,正处理第" + (i + 1) + "帧图片");
  35. Java2DFrameConverter converter = new Java2DFrameConverter();
  36. BufferedImage bi = converter.getBufferedImage(videoFrame);
  37. BufferedImage bufferedImage = grayProcess(bi);
  38. recorder.record(converter.convert(bufferedImage));
  39. }
  40. }
  41. //处理音频
  42. for (int i = 0; i < audioGrabber.getLengthInAudioFrames(); i++) {
  43. Frame audioFrame = audioGrabber.grabSamples();
  44. if (audioFrame != null && audioFrame.samples != null) {
  45. recorder.recordSamples(audioFrame.sampleRate, audioFrame.audioChannels, audioFrame.samples);
  46. }
  47. }
  48. recorder.stop();
  49. recorder.release();
  50. videoGrabber.stop();
  51. audioGrabber.stop();
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. //图片灰度处理
  57. public static void imageProcess(String sourceFilePath) {
  58. try {
  59. BufferedImage image = ImageIO.read(new File(sourceFilePath));
  60. grayProcess(image);
  61. String format = sourceFilePath.substring(sourceFilePath.lastIndexOf(".") + 1);
  62. ImageIO.write(image, format, new File(imageFolderPath + "new" + imageName));
  63. } catch (IOException e) {
  64. e.printStackTrace();
  65. }
  66. }
  67. //灰度处理
  68. public static BufferedImage grayProcess(BufferedImage bufImg) {
  69. int width = bufImg.getWidth();
  70. int height = bufImg.getHeight();
  71. for (int i = 0; i < width; i++) {
  72. for (int j = 0; j < height; j++) {
  73. bufImg.setRGB(i, j, grayRGB(bufImg.getRGB(i, j)));
  74. }
  75. }
  76. return bufImg;
  77. }
  78. //rgb灰度转换
  79. private static int grayRGB(int rgb) {
  80. int R = (rgb & 0xff0000) >> 16;
  81. int G = (rgb & 0x00ff00) >> 8;
  82. int B = rgb & 0x0000ff;
  83. //平均值
  84. String average = Integer.toHexString((R + G + B) / 3);
  85. if (average.length() == 1) {
  86. average = "0" + average;
  87. }
  88. //RGB都变成平均值
  89. return Integer.parseInt(average + average + average, 16);
  90. }
  91. }

补充知识:

RGB颜色是由红(Red)、绿(Green)、蓝(Blue)三原色组成的,所以可以使用这三个颜色的组合来代表一种具体的颜色,其中R、G、B的每个数值都位于0-255之间。在表达颜色的时候,即可以使用三个数字来表达,也可以使用一个格式如0X00RRGGBB这样格式的十六进制来表达,下面是常见颜色的表达形式:

  红色:(255,0,0)或0x00FF0000

  绿色:(0,255,0)或0x0000FF00

  蓝色:(0,0,255)或0x00FFFFFF 

在编写java图像处理程序时,需要对图像进行灰度化和二值化处理,首先将颜色值与十六进制表示的00ff0000进行“与”运算,运算结果除了表示红色的数字值之外,GGBB部分颜色都为0,在将结果向右移位16位,得到的就是红色值。
同样的,我们也可以通过以下代码得到green和blue的值:

  1. int red = (rgb & 0x00ff0000) >> 16;
  2. int green = (color & 0x0000ff00) >> 8; // 250 = 0xfa
  3. int blue = (color & 0x000000ff); // 255 = 0xff

更多图像RGB知识可以百度一下。 

控制台运行输出日志

肯动脑筋的小伙伴,把代码稍加改造也可以做成纯黑白画视频。 

 相关文章推荐

《震惊,java仅用30行代码就实现了视频转音频的批量转换》

特别说明:如需转载此篇文章,请先关注本人后,注明作者名称,和文章链接地址即可。

原文链接:https://blog.csdn.net/weixin_40986713/article/details/117228972



所属网站分类: 技术文章 > 博客

作者:我很伤感

链接:http://www.javaheidong.com/blog/article/207179/9240dd618856b4a09267/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)