Wes*_*ley 14 python opencv numpy image-processing
尝试提高图像亮度时遇到问题.
这是原始图像:
我想要的图像是这样的:
现在使用以下代码增加亮度:
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
Run Code Online (Sandbox Code Playgroud)
而且,我得到了以下图像:
所以,似乎某些点的亮度溢出.
我试图将阈值从200更改为其他数字,例如125,100,140等.但是,图像亮度几乎保持相同的暗或溢出.
ENV:
Python:2.7.10
Opencv:3.2.0
对此有任何建议表示赞赏.
谢谢.
Dan*_*šek 30
这是我用一种清理特定图像的简单算法的镜头.随意玩它并进一步调整以获得所需的结果.
注意:显示的代码应该适用于OpenCV的2.4.x和3.x分支.
将输入图像加载为灰度.
img = cv2.imread('paper.jpg',0)
Run Code Online (Sandbox Code Playgroud)
扩大图像,以摆脱文本.此步骤有助于保留条形码.
dilated_img = cv2.dilate(img, np.ones((7,7), np.uint8))
Run Code Online (Sandbox Code Playgroud)
中位数使用适当大小的内核模糊结果以进一步抑制任何文本.
这应该会给我们一个相当不错的背景图像,其中包含所有阴影和/或变色.
bg_img = cv2.medianBlur(dilated_img, 21)
Run Code Online (Sandbox Code Playgroud)
计算我们刚刚获得的原始和背景之间的差异.相同的位将是黑色(接近0差异),文本将是白色(大差异).
因为我们想要白色的黑色,我们反转结果.
diff_img = 255 - cv2.absdiff(img, bg_img)
Run Code Online (Sandbox Code Playgroud)
标准化图像,以便我们使用完整的动态范围.
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)
Run Code Online (Sandbox Code Playgroud)
在这一点上,我们仍然有一些灰色的纸张.我们可以将其截断,并重新标准化图像.
_, 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)
Run Code Online (Sandbox Code Playgroud)
完成...
好吧,至少对我来说;)你可能想要裁剪它,并做任何你想要的后处理.
注意:获得差异图像后,可能需要切换到更高的精度(16位int或浮点数),以便最大限度地减少重复归一化中的累积舍入误差.