如何使用 opencv 自动调整扫描图像的对比度和亮度 python
How to auto adjust contrast and brightness of a scanned Image with opencv python
我想自动调整从 phone 拍摄的彩色图像在不同光照条件下的亮度和对比度。请帮助我,我是 OpenCV 的新手。
来源:
Input Image
结果:
result
我正在寻找的更多是本地化的转换。从本质上讲,我希望阴影尽可能地变亮,如果可能的话完全消失,并使图像的较暗像素变暗,对比度更高,而较亮的像素则变白,但不要达到过度曝光或任何东西的程度就这样。
我尝试了 CLAHE
、Histogram Equalization
、Binary Thresholding
、Adaptive Thresholding
等,但没有任何效果。
我最初的想法是我需要中和 Highlights
并使较暗的像素更接近平均值,同时使文本和线条尽可能暗。然后也许做一个对比过滤器。但是我无法得到结果请帮助我。
您可以使用任何本地二值化方法。在 OpenCV 中,有一种称为 Wolf-Julion 局部二值化的方法可以应用于输入图像。以下是示例代码片段:
import cv2
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)[:,:,2]
T = cv2.ximgproc.niBlackThreshold(gray, maxValue=255, type=cv2.THRESH_BINARY_INV, blockSize=81, k=0.1, binarizationMethod=cv2.ximgproc.BINARIZATION_WOLF)
grayb = (gray > T).astype("uint8") * 255
cv2.imshow("Binary", grayb)
cv2.waitKey(0)
上面代码的输出结果如下。请注意,要使用 ximgproc
模块,您需要安装 opencv contrib 包。
这是 Python/OpenCV 中的一种方法。
- 读取输入
- 增加对比度
- 将原图转换为灰度
- 自适应阈值
- 使用阈值图像使对比度增加图像的背景变白
- 保存结果
输入:
import cv2
import numpy as np
# read image
img = cv2.imread("math_diagram.jpg")
# convert img to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# do adaptive threshold on gray image
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 21, 15)
# make background of input white where thresh is white
result = img.copy()
result[thresh==255] = (255,255,255)
# write results to disk
cv2.imwrite("math_diagram_threshold.jpg", thresh)
cv2.imwrite("math_diagram_processed.jpg", result)
# display it
cv2.imshow("THRESHOLD", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
阈值图像:
结果:
我想自动调整从 phone 拍摄的彩色图像在不同光照条件下的亮度和对比度。请帮助我,我是 OpenCV 的新手。
来源: Input Image
结果: result
我正在寻找的更多是本地化的转换。从本质上讲,我希望阴影尽可能地变亮,如果可能的话完全消失,并使图像的较暗像素变暗,对比度更高,而较亮的像素则变白,但不要达到过度曝光或任何东西的程度就这样。
我尝试了 CLAHE
、Histogram Equalization
、Binary Thresholding
、Adaptive Thresholding
等,但没有任何效果。
我最初的想法是我需要中和 Highlights
并使较暗的像素更接近平均值,同时使文本和线条尽可能暗。然后也许做一个对比过滤器。但是我无法得到结果请帮助我。
您可以使用任何本地二值化方法。在 OpenCV 中,有一种称为 Wolf-Julion 局部二值化的方法可以应用于输入图像。以下是示例代码片段:
import cv2
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)[:,:,2]
T = cv2.ximgproc.niBlackThreshold(gray, maxValue=255, type=cv2.THRESH_BINARY_INV, blockSize=81, k=0.1, binarizationMethod=cv2.ximgproc.BINARIZATION_WOLF)
grayb = (gray > T).astype("uint8") * 255
cv2.imshow("Binary", grayb)
cv2.waitKey(0)
上面代码的输出结果如下。请注意,要使用 ximgproc
模块,您需要安装 opencv contrib 包。
这是 Python/OpenCV 中的一种方法。
- 读取输入
- 增加对比度
- 将原图转换为灰度
- 自适应阈值
- 使用阈值图像使对比度增加图像的背景变白
- 保存结果
输入:
import cv2
import numpy as np
# read image
img = cv2.imread("math_diagram.jpg")
# convert img to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# do adaptive threshold on gray image
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 21, 15)
# make background of input white where thresh is white
result = img.copy()
result[thresh==255] = (255,255,255)
# write results to disk
cv2.imwrite("math_diagram_threshold.jpg", thresh)
cv2.imwrite("math_diagram_processed.jpg", result)
# display it
cv2.imshow("THRESHOLD", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
阈值图像:
结果: