[英]How to do a localized Contrast Enhancement In a scanned Image Using OpenCV Python
[英]contrast enhancement how linearly stretch the grey levels of an image?
img值的屏幕截图 2 [这是原始的] 3 [这是预期的输出] 这是我得到的输出我试图在python中将灰度级别从0-100
拉伸到50-200
,但是输出图像是不正确的。 我画了代表两个范围之间线性关系的直线,在第8行中,我使用此方程式获得输出。 我的代码有什么问题?
这是我的第一个问题,非常抱歉。
def Contrast_enhancement(img):
newimg = img
height = img.shape[0]
width = img.shape[1]
for i in range(height):
for j in range(width):
if(img[i][j] * 255 >= 0 and img[i][j] * 255 <= 100):
newimg[i][j] = (((3/2) * (img[i][j] * 255)) + 50)/255
return newimg
import numpy as np
import copy
def Contrast_enhancement(img):
newimg = np.array(copy.deepcopy(img)) #this makes a real copy of img, if you dont, any change to img will change newimg too
temp_img=np.array(copy.deepcopy(img))*3/2+50/255
newimg = np.where(newimg<=100,temp_img,newimg)
return newimg
或更短:
import numpy as np
import copy
def Contrast_enhancement(img):
newimg = np.array(copy.deepcopy(img)) #this makes a real copy of img, if you dont, any change to img will change newimg too
newimg = np.where(newimg<=100,newimg*3/2+50/255,newimg)
return newimg
复制部分应该可以解决您的问题,而numpy部分只是为了加快处理速度。 如果newimg <= 100,则Np.where返回temp_img,否则返回newimg。
您的问题有两个答案:
我在这里关注第二种情况。 从您提供的图像样本来看,您没有采取正确的方法。 让我们考虑一下您提供的样本确实具有所有0-100之间的强度值(从我个人电脑中的屏幕捕获来看,它们没有,但是屏幕取决于一定程度)。 您的方法似乎正确,应该可以解决一些小错误。
1)例如,一个小错误是:
newimg = img
不按照您的想法去做。 它确实创建了原始变量的别名。 采用:
newimg = img.copy()
代替。
2)如果出现具有不同边界的图像,则您的代码已损坏。 由于某种原因,它将忽略某些像素,我猜这不是您想要的。
3)在这种情况下,可以使用以下方法将所需的拉伸应用于整个图像:
newimg -= np.min(newimg)
newimg /= np.max(newimg)
只是将您的强度拉伸到0-255边界。
4)从样本图像来看,您还需要进行更彻底的拉伸(这会牺牲一些图像信息以增加图像对比度)。 可以使用下限值代替上述值:
newimg -= np.min(newimg)
newimg /= (np.max(newimg) * 0.5)
这样可以有效地“燃烧”一些像素,但在您的情况下,结果看起来更接近您想要的像素。 除此之外,您还可以将旧强度的非线性映射(例如对数映射)应用于新强度,并且不会得到任何“灼伤”像素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.