对比度增强如何线性地拉伸图像的灰度级?

时间:2018-11-02 12:33:53

标签: python stretching

a screenshot of the img values 2 [这是原始的} 3 [这是预期的输出] this is the output I get我正在尝试从{{1} }到python中的0-100,但输出图像不正确。 我画了代表两个范围之间线性关系的直线,在第8行中,我使用此方程式获得输出。 我的代码有什么问题?

这是我的第一个问题,非常抱歉。

50-200

2 个答案:

答案 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)

您的问题有两个答案:

  • 这是严格的技术(@DonQuiKong试图回答的一种),它指的是如何简单或正确地进行拉伸。
  • 另一个是隐式的,试图回答您图像拉伸的实际问题。

我在这里关注第二种情况。从您提供的图像样本来看,您没有采取正确的方法。让我们考虑一下您提供的样本确实具有所有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)

这有效地“燃烧”了一些像素,但是在您的情况下,结果看起来更接近您想要的像素。除此之外,您还可以将旧强度的非线性映射(例如对数映射)应用于新强度,而不会得到任何“灼伤”像素。

值为0.5的样本:
enter image description here