增加图像亮度

2024-05-16 06:33:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试图增加图像亮度时遇到了问题。

这是原始图像:

enter image description here

我想得到的图像是这样的:

enter image description here

现在使用以下代码增加亮度:

    image = cv2.imread("/home/wni/vbshare/tmp/a4_index2.png",0)

    if sum(image[0])/len(image[0])<200:
        new = np.where((255-image)<image,255,image*2)
    else:
        new = image
    return new

我得到了以下图像:

enter image description here

所以,似乎有些点的亮度溢出了。

我试着把阈值从200改成其他数字,例如125,100,140等等 然而,图像亮度保持几乎相同的暗或溢出。

环境:

Python:2.7.10

Opencv:3.2.0版

如有任何建议,我们将不胜感激。

谢谢。


Tags: 代码图像imagehomenewifpngcv2
2条回答

这是我拍摄的一个简单的算法,用于清理特定的图像。可以随意使用它,并进一步调整它,以获得所需的结果。

NB:显示的代码应该同时适用于OpenCV的2.4.x和3.x分支。

步骤0

将输入图像加载为灰度。

img = cv2.imread('paper.jpg',0)

步骤1

放大图像,以便去掉文本。 这一步有助于保留条形码。

dilated_img = cv2.dilate(img, np.ones((7,7), np.uint8)) 

Dilated

步骤2

中值模糊结果与一个像样的大小内核,以进一步抑制任何文本。

这会给我们一个相当好的背景图像,包含所有的阴影和/或变色。

bg_img = cv2.medianBlur(dilated_img, 21)

Blurred

步骤3

计算原始图像和我们刚刚得到的背景之间的差异。相同的位将是黑色(接近0差),文本将是白色(大差)。

既然我们要黑对白,我们就把结果颠倒过来。

diff_img = 255 - cv2.absdiff(img, bg_img)

Inverted Difference

步骤4

将图像规格化,以便使用完整的动态范围。

norm_img = diff_img.copy() # Needed for 3.x compatibility
cv2.normalize(diff_img, norm_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)

Normalized

步骤5

现在我们的报纸还是有些灰色。我们可以将其截断,然后重新规范化图像。

_, thr_img = cv2.threshold(norm_img, 230, 0, cv2.THRESH_TRUNC)
cv2.normalize(thr_img, thr_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)

Gray Trimmed

完成。。。

好吧,至少对我来说是这样;)你可能会想修剪它,然后做任何你想做的后处理。


注意:在得到差分图像后,可能需要切换到更高的精度(16位int或float),以最小化重复规格化中累积的舍入误差。

你需要的是thresholding。这将允许您将所有不太暗的设置为纯白色,并将非常暗的设置为纯黑色(或任何其他颜色)。这会让你开始:

cutoff_val = 100 # everything above this is set to set_color
set_color = 255 
ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_BINARY)

在您使用它之后,可以使用adaptive thresholding获得更好的结果。

请看this great tutorial基本上做你想做的事情---还有一个额外的好处,它包括一个关于扭曲的教程,可以得到一个矩形区域的纸张,太!

编辑:我得到了相当好的结果与您的图像结合阈值,然后自适应阈值。

cutoff_val = 150 # everything above this is set to the cutoff val
set_color = 255 # if 
ret,thresh_img = cv2.threshold(image,cutoff_val,set_color,cv2.THRESH_TRUNC)
window_sz = 3
thresh_img2 = cv2.adaptiveThreshold(thresh_img,set_color,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
            cv2.THRESH_BINARY,window_sz,2)

相关问题 更多 >