当前位置:   article > 正文

OpenCV 图像处理 ------ 白平衡算法_opencv白平衡算法

opencv白平衡算法

参考:https://www.cnblogs.com/ggYYa/p/5707259.html

原图:

原图

处理后的图片:

处理后的图片

代码:

  1. public class BalanceWhite {
  2. public static void main(String[] args) {
  3. System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
  4. Mat src = Imgcodecs.imread("d:/c/bai1.png");
  5. if (src.empty()) {
  6. System.err.println("The picture doesn't exist");
  7. return;
  8. }
  9. // 自己写的显示图片的方法
  10. Images.showImage(src);
  11. BalanceWhite b = new BalanceWhite();
  12. b.balanceWhite(src);
  13. }
  14. // 白平衡算法
  15. void balanceWhite(Mat src) {
  16. Mat dstImage = new Mat();
  17. List<Mat> imgChannels = new ArrayList<>();
  18. // 分离通道
  19. Core.split(src, imgChannels);
  20. Mat imageBlueChannel = imgChannels.get(0);
  21. Mat imageGreenChannel = imgChannels.get(1);
  22. Mat imageRedChannel = imgChannels.get(2);
  23. // 求各通道的平均值
  24. double imageBlueChannelAvg = Core.mean(imageBlueChannel).val[0];
  25. double imageGreenChannelAvg = Core.mean(imageGreenChannel).val[0];
  26. double imageRedChannelAvg = Core.mean(imageRedChannel).val[0];
  27. // 求出各通道所占增益
  28. double K = (imageRedChannelAvg + imageGreenChannelAvg + imageRedChannelAvg) / 3;
  29. double Kb = K / imageBlueChannelAvg;
  30. double Kg = K / imageGreenChannelAvg;
  31. double Kr = K / imageRedChannelAvg;
  32. // 更新白平衡后的各通道BGR值,原来是用addWeighted()方法,为了知道清楚的了解内部的运算,写了一个方法。
  33. addK(imageBlueChannel, Kb);
  34. addK(imageGreenChannel, Kg);
  35. addK(imageRedChannel, Kr);
  36. // 使用 addWeighted() 方法,效果和 addK() 方法一样
  37. // Core.addWeighted(imageBlueChannel, Kb, imageBlueChannel, 0, 0,
  38. // imageBlueChannel);
  39. // Core.addWeighted(imageGreenChannel, Kg, imageGreenChannel, 0, 0,
  40. // imageGreenChannel);
  41. // Core.addWeighted(imageRedChannel, Kr, imageRedChannel, 0, 0,
  42. // imageRedChannel);
  43. Core.merge(imgChannels, dstImage);
  44. // 自己写的显示图片方法
  45. Images.showImage(dstImage);
  46. }
  47. // 增加每个元素的增益值
  48. void addK(Mat mat, double k) {
  49. for (int i = 0; i < mat.rows(); i++) {
  50. for (int j = 0; j < mat.cols(); j++) {
  51. double val = mat.get(i, j)[0] * k;
  52. mat.put(i, j, val);
  53. }
  54. }
  55. }
  56. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/287521
推荐阅读
相关标签
  

闽ICP备14008679号