15

我有一张已扫描的图像,但屏幕上的白纸不是白色的。有没有办法平衡合同/亮度以使背景更白?

更新

我已经尝试了 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();

但是得到一个更糟糕的结果(也是在第一次灰度时):

我是否缺少其他参数?

4

5 回答 5

21

我在这里讨论了一些技术:如何在 C 中调整 OpenCV 中的对比度?

请检查一下。以下是我在您的图像上尝试最后两种方法时得到的结果

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 中的代码)

结果如下:

在此处输入图像描述

于 2012-05-12T05:39:23.717 回答
6

我建议使用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)
于 2012-05-12T10:11:10.703 回答
5

要更改亮度和对比度,您可以将像素值相乘,然后向它们添加一些常数。(有关更改图像对比度和亮度的更多信息,请参见 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 左右(实际上,如果您使用 172,它是 172 img.max())。因此,您可以将图像乘以255/172 = 1.48增加亮度。

请参阅以下结果:

在此处输入图像描述

以及直方图,分别为:

在此处输入图像描述

于 2018-09-16T22:24:49.100 回答
4

它被称为equalizeHist。我不知道它在 emgu 中的名称,但结果应该正是您所需要的 - 更亮的背景和更暗的文本。

编辑

要仅提取边缘(这与图像增强技术非常不同),您可以简单地应用 Canny。选择 20 和 60 这两个阈值作为开始,然后增加(或减少)它们之间的比例保持为 3:1,直到获得好看的边缘图像。

于 2012-05-12T05:11:19.897 回答
-1

无论哪种方式,您还可以检查每个像素。如果小于定义的值,则将其设置为 0,如果超过定义的值,则将其设置为 255。

于 2012-05-13T02:50:19.293 回答