当拍摄一张纸时(例如用手机相机) ,我得到以下结果(左图)(jpg 下载 给你)。理想的结果(用图像编辑软件手动处理)在右边:
我想用 openCV 处理原始图像,以获得更好的亮度/对比度 自然而然地(这样背景更白) 。
假设: 图像有一个 A4的肖像格式(我们不需要透视-在这个主题扭曲它在这里) ,纸是白色的,可能有文字/图像在黑色或颜色。
到目前为止我所做的努力:
各种 自适应阈值分割法方法,如高斯,OTSU (见 OpenCV doc 图像阈值)。它通常与 OTSU 很好地工作:
ret, gray = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
但它只适用于灰度图像 ,而不直接适用于彩色图像。此外,输出是二进制(白色或黑色) ,这是我不想要的: 我更喜欢保持一个彩色非二进制图像作为输出
正如这个 回答(不能处理彩色图像的直方图均衡化-OpencV)或这个 一(OpenCV Python 均衡 Hist 彩色图像)所建议的:
img3 = cv2.imread(f)
img_transf = cv2.cvtColor(img3, cv2.COLOR_BGR2YUV)
img_transf[:,:,0] = cv2.equalizeHist(img_transf[:,:,0])
img4 = cv2.cvtColor(img_transf, cv2.COLOR_YUV2BGR)
cv2.imwrite('test.jpg', img4)
或单纯疱疹病毒:
img_transf = cv2.cvtColor(img3, cv2.COLOR_BGR2HSV)
img_transf[:,:,2] = cv2.equalizeHist(img_transf[:,:,2])
img4 = cv2.cvtColor(img_transf, cv2.COLOR_HSV2BGR)
不幸的是,结果相当糟糕,因为它在局部造成了可怕的微观对比(?) :
我也尝试了 YCbCr 代替,它是类似的。
我还尝试了 对比有限公司适应直方图均衡化和从 1
到 1000
的各种 tileGridSize
:
img3 = cv2.imread(f)
img_transf = cv2.cvtColor(img3, cv2.COLOR_BGR2HSV)
clahe = cv2.createCLAHE(tileGridSize=(100,100))
img_transf[:,:,2] = clahe.apply(img_transf[:,:,2])
img4 = cv2.cvtColor(img_transf, cv2.COLOR_HSV2BGR)
cv2.imwrite('test.jpg', img4)
但结果也同样糟糕。
正如问题 如何应用 CLAHE 的 RGB 彩色图像中所建议的,使用 LAB 颜色空间执行这个 CLAHE 方法:
import cv2, numpy as np
bgr = cv2.imread('_example.jpg')
lab = cv2.cvtColor(bgr, cv2.COLOR_BGR2LAB)
lab_planes = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0,tileGridSize=(100,100))
lab_planes[0] = clahe.apply(lab_planes[0])
lab = cv2.merge(lab_planes)
bgr = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
cv2.imwrite('_example111.jpg', bgr)
输出图像:
做一个自适应的阈值或直方图均衡化 分别在每个频道上播放(R,G,B)不是一个选项,因为它会干扰色彩平衡,如解释 给你。
“对比拉伸” 方法来自 scikit-image
在 直方图均衡化上的教程:
图像被重新调整以包括所有属于第2和第98百分位数的强度
是好一点,但仍然远远没有达到预期的结果(见图片顶部的这个问题)。
DR: 如何使用 OpenCV/Python 实现彩色纸张照片的自动亮度/对比度优化?可以使用什么样的阈值/直方图均衡化/其他技术?