如何使用opencv python自动调整扫描图像的对比度和亮度

如何使用opencv python自动调整扫描图像的对比度和亮度,python,opencv,brightness,contrast,image-preprocessing,Python,Opencv,Brightness,Contrast,Image Preprocessing,我想在不同的照明条件下自动调整手机拍摄的彩色图像的亮度和对比度。请帮助我,我是OpenCV新手 资料来源: 结果: 我所寻找的更多的是本地化转换。本质上,我希望阴影尽可能地变亮,如果可能的话,完全消失,让图像中的较暗像素变暗,对比度更高,光线像素变白,但不要过度曝光或诸如此类 我尝试过CLAHE、直方图均衡化、二进制阈值、自适应阈值等,但都没有成功 我最初的想法是,我需要中和高光,使较暗的像素更接近平均值,同时保持文本和线条尽可能暗。然后做一个对比度过滤器。但是我无法得到结果,请帮助我。您可

我想在不同的照明条件下自动调整手机拍摄的彩色图像的亮度和对比度。请帮助我,我是OpenCV新手

资料来源:

结果:

我所寻找的更多的是本地化转换。本质上,我希望阴影尽可能地变亮,如果可能的话,完全消失,让图像中的较暗像素变暗,对比度更高,光线像素变白,但不要过度曝光或诸如此类

我尝试过CLAHE、直方图均衡化、二进制阈值、自适应阈值等,但都没有成功


我最初的想法是,我需要中和高光,使较暗的像素更接近平均值,同时保持文本和线条尽可能暗。然后做一个对比度过滤器。但是我无法得到结果,请帮助我。

您可以使用任何本地二值化方法。在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)