【问题标题】:How do I equalize contrast & brightness of images using opencv?如何使用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 会给出更糟糕的结果.. 我有时也有这个问题..

标签: c# opencv image-manipulation emgucv


【解决方案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。

          【讨论】:

            猜你喜欢
            • 2012-12-03
            • 2016-06-08
            • 1970-01-01
            • 2012-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-01
            相关资源
            最近更新 更多