当前位置:   article > 正文

opencv 白平衡_opencv 白平衡算法

opencv 白平衡算法

目录

python 随机白平衡增强:


这个可以参考:

python opencv白平衡算法_基于图像分析的偏色检测及颜色校正方法 :param img: cv2.imread读取的图片数据 :-CSDN博客


OpenCV 图像白平衡算法(相机自动白平衡)

彩色相机内部有三个CCD电子耦合元件,分别用来感受红绿蓝三中颜色的光线,默认情况下,三个颜色的感光电路信号的放大比例是1:1:1的。在理想的拍摄环境下,纯白色的RGB分量按照1:1:1的比例放大之后,得到的是没有偏色的白色,当在非理想的环境光条件下,白色成像出来的效果会偏向环境光的颜色,而不是纯白色。

相机的自动白平衡就是要通过改变RGB感光电路信号的放大比例,让受环境光影响的白色还原成纯白色,保证在各种光线条件下,成像色彩跟物体真实的色彩保持一致

常用的一种自动白平衡算法是灰度世界法,它假设对于一副色彩丰富的图像,图像上RGB三个分量的平均值趋于同一个灰度值,一般取这个灰度值的大小为RGB三分量的平均值。

python 随机白平衡增强:

  1. import cv2
  2. import numpy as np
  3. def random_color_augmentation(image):
  4. # 将图像从BGR颜色空间转换为HSV颜色空间
  5. hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
  6. # 随机生成色调、饱和度和亮度的增强系数
  7. hue_shift = np.random.randint(-10, 10)
  8. saturation_scale = np.random.uniform(0.8, 1.2)
  9. value_scale = np.random.uniform(0.8, 1.2)
  10. # 调整色调
  11. hsv_image[:, :, 0] = (hsv_image[:, :, 0] + hue_shift) % 180
  12. # 调整饱和度和亮度
  13. hsv_image[:, :, 1] = np.clip(hsv_image[:, :, 1] * saturation_scale, 0, 255)
  14. hsv_image[:, :, 2] = np.clip(hsv_image[:, :, 2] * value_scale, 0, 255)
  15. # 将图像从HSV颜色空间转换回BGR颜色空间
  16. enhanced_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)
  17. return enhanced_image
  18. # 读取图像
  19. image = cv2.imread('aaa.png')
  20. while True:
  21. # 进行白平衡处理
  22. balanced_image = random_color_augmentation(image)
  23. # 显示原始图像和处理后的图像
  24. cv2.imshow('Original Image', image)
  25. cv2.imshow('Balanced Image', balanced_image)
  26. cv2.waitKey(0)

以下是OpenCV实现的灰度世界法:

python:

  1. import cv2 as cv
  2. # import numpy as np
  3. # 读取图像
  4. img = cv.imread(r'F:\images\11.jpg')
  5. r, g, b = cv.split(img)
  6. r_avg = cv.mean(r)[0]
  7. g_avg = cv.mean(g)[0]
  8. b_avg = cv.mean(b)[0]
  9. # 求各个通道所占增益
  10. k = (r_avg + g_avg + b_avg) / 3
  11. kr = k / r_avg
  12. kg = k / g_avg
  13. kb = k / b_avg
  14. r = cv.addWeighted(src1=r, alpha=kr, src2=0, beta=0, gamma=0)
  15. g = cv.addWeighted(src1=g, alpha=kg, src2=0, beta=0, gamma=0)
  16. b = cv.addWeighted(src1=b, alpha=kb, src2=0, beta=0, gamma=0)
  17. balance_img = cv.merge([b, g, r])

c++

  1. #include <highgui/highgui.hpp>
  2. #include <imgproc/imgproc.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. Mat imageSource = imread("02.jpg");
  7. imshow("原始图像", imageSource);
  8. vector<Mat> imageRGB;
  9. //RGB三通道分离
  10. split(imageSource, imageRGB);
  11. //求原始图像的RGB分量的均值
  12. double R, G, B;
  13. B = mean(imageRGB[0])[0];
  14. G = mean(imageRGB[1])[0];
  15. R = mean(imageRGB[2])[0];
  16. //需要调整的RGB分量的增益
  17. double KR, KG, KB;
  18. KB = (R + G + B) / (3 * B);
  19. KG = (R + G + B) / (3 * G);
  20. KR = (R + G + B) / (3 * R);
  21. //调整RGB三个通道各自的值
  22. imageRGB[0] = imageRGB[0] * KB;
  23. imageRGB[1] = imageRGB[1] * KG;
  24. imageRGB[2] = imageRGB[2] * KR;
  25. //RGB三通道图像合并
  26. merge(imageRGB, imageSource);
  27. imshow("白平衡调整后", imageSource);
  28. waitKey();
  29. return 0;
  30. }

原始图像一,整体图像偏绿色:

白平衡校正后,天空的蓝色和树叶的绿色都得到了很好的还原:

原始图像二,整体偏黄色:

白平衡校正后效果:

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

闽ICP备14008679号