a screenshot of the img values 2 [这是原始的} 3 [这是预期的输出] this is the output I get我正在尝试从{{1} }到python中的0-100
,但输出图像不正确。
我画了代表两个范围之间线性关系的直线,在第8行中,我使用此方程式获得输出。
我的代码有什么问题?
这是我的第一个问题,非常抱歉。
50-200
答案 0 :(得分:0)
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。
答案 1 :(得分:0)
您的问题有两个答案:
我在这里关注第二种情况。从您提供的图像样本来看,您没有采取正确的方法。让我们考虑一下您提供的样本确实具有所有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)
这有效地“燃烧”了一些像素,但是在您的情况下,结果看起来更接近您想要的像素。除此之外,您还可以将旧强度的非线性映射(例如对数映射)应用于新强度,而不会得到任何“灼伤”像素。