如何使用opencv均衡图像的对比度和亮度?
Posted
技术标签:
【中文标题】如何使用opencv均衡图像的对比度和亮度?【英文标题】:How do I equalize contrast & brightness of images using opencv? 【发布时间】:2012-05-20 15:10:40 【问题描述】:我已经扫描了一张图像,但屏幕上的白纸不是白色的。有没有办法均衡合同/亮度以使背景更白?
更新
我已经尝试了 EmguCv 中建议的 Image._EqualizeHist 函数:
string file = @"IMG_20120512_055533.jpg";
Image<Bgr, byte> originalColour = new Image<Bgr, byte>(file);
Image<Bgr, byte> improved = originalColour.Clone();
improved._EqualizeHist();
但得到更糟糕的结果(在第一次灰度时也是如此):
我是否缺少其他参数?
【问题讨论】:
Stack Overflow 提供免费的图片托管服务,只需单击工具栏中的图片按钮,然后将其指向您本地托管在您计算机上或网络上其他地方的图片。这实际上会上传和镜像图像的副本,从而确保它始终可用,即使外部源出现故障。我已经转移了你发布的图片,但只是为了将来记住一些事情。 我不知道为什么,但在这种情况下,equalizehist 会给出更糟糕的结果.. 我有时也有这个问题.. 【参考方案1】:我在这里讨论了一些技术:How can I adjust contrast in OpenCV in C?
请检查。以下是我在您的图像上尝试最后两种方法时得到的结果
1) 阈值:
阈值化给出二值图像。如果这是你想要的,你可以申请threshold function
2) 如果需要灰度图:
补充:
Morphological closing
也适用于您的情况
img = cv2.imread('home.jpg',0)
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
close = cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kernel1)
div = np.float32(gray)/(close)
res = np.uint8(cv2.normalize(div,div,0,255,cv2.NORM_MINMAX))
(Python API 中的代码)
结果如下:
【讨论】:
【参考方案2】:我建议使用AdaptiveThreshold。它通过对图像中的每个像素进行局部邻域阈值处理来工作(当有渐变背景时,这真的很重要,比你的图像强一点)。 blockSize
参数为邻域大小,处理后的像素值必须大于平均邻域值减去param1
。
下面是在python中怎么做(转换成c应该很容易):
import cv
im = cv.LoadImage("9jU1Um.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
cv.AdaptiveThreshold(im, im, 255, cv.CV_ADAPTIVE_THRESH_MEAN_C,
cv.CV_THRESH_BINARY, blockSize=31, param1=15)
cv.ShowImage('image', im)
cv.WaitKey(0)
【讨论】:
【参考方案3】:要更改亮度和对比度,您可以将像素值相乘,然后向它们添加一些常数。 (有关 Changing the contrast and brightness of an image 的更多信息,请参阅 OpenCV 文档。)
使用python和numpy:
import cv2 as cv
import numpy as np
img = cv.imread('b.jpg',0) # loads in grayscale
alpha = 1
beta = 0
res = cv.multiply(img, alpha)
res = cv.add(res, beta)
你也可以使用:
res = cv.convertScaleAbs(img, alpha = alpha, beta = beta)
在您的图像中,您可以在直方图中检查最大值在 170 左右(实际上,如果您使用 img.max()
,它是 172)。因此,您可以将图像乘以 255/172 = 1.48
以增加亮度。
查看以下结果:
和直方图分别:
【讨论】:
【参考方案4】:它被称为equalizeHist。我不知道它在 emgu 中的名称,但结果应该正是您所需要的 - 更亮的背景和更暗的文本。
编辑
要仅提取边缘(这与图像增强技术非常不同),您可以简单地应用 Canny。选择 20 和 60 这两个阈值作为开始,然后增加(或减少)它们之间的比例保持为 3:1,直到获得好看的边缘图像。
【讨论】:
【参考方案5】:无论哪种方式,您都可以检查每个像素。如果小于定义的值,则将其设置为 0,如果超过定义的值,则将其设置为 255。
【讨论】:
以上是关于如何使用opencv均衡图像的对比度和亮度?的主要内容,如果未能解决你的问题,请参考以下文章
学习 opencv--- 创建Trackbar(活动条) &图像对比度,亮度值调整