Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
直方图均衡化Python(无Numpy和无打印)_Python_Image_Histogram_Contrast_Cv2 - Fatal编程技术网

直方图均衡化Python(无Numpy和无打印)

直方图均衡化Python(无Numpy和无打印),python,image,histogram,contrast,cv2,Python,Image,Histogram,Contrast,Cv2,我正在尝试编写一个代码,用于增加灰度图像的对比度,使其更清晰。我似乎无法让这个代码正常工作。我试图获得像素中每个值的分布频率(不使用除cv2以外的任何模块),并获得累积分布频率,这样我就可以使用下面的等式更改值。知道我的代码有什么问题吗 import cv2 img=cv2.imread(raw_input()) shape=img.shape row=shape[0] col=shape[1] def df(img): #to make a histogram (count distribu

我正在尝试编写一个代码,用于增加灰度图像的对比度,使其更清晰。我似乎无法让这个代码正常工作。我试图获得像素中每个值的分布频率(不使用除cv2以外的任何模块),并获得累积分布频率,这样我就可以使用下面的等式更改值。知道我的代码有什么问题吗

import cv2
img=cv2.imread(raw_input())
shape=img.shape
row=shape[0]
col=shape[1]

def df(img): #to make a histogram (count distribution frequency)
    values=[]
    occurances=[]
    for i in range (len(img)):
        for j in img[i]:
            values.append(j)
            if j in values:
                count +=3
                occurances.append(count)
    return occurances

def cdf (img): #cumulative distribution frequency
    values2=[]
    for i in values:
        j=0
        i=i+j
        j+1
        values2.append(i)
    return values2

def h(img): #equation for the new value of each pixel
    h=((cdf(img)-1)/((row*col)-1))*255
    return h

newimage=cv2.imwrite('a.png')
这是我试图做的一个例子。


提前谢谢。

如果您不知道,opencv提供了一个内置的直方图均衡功能,有文档记录

关于您的代码:

分布频率(或直方图)计算不正确,因为您只计算图像中确实出现的颜色的频率。您应该计算所有颜色值的外观,即使它们没有出现。 此外,每次你的颜色重新出现时,你都会在列表中添加该颜色的新元素,这没有多大意义。我也不太确定+=3从哪里来

我会这样做:

def df(img): #to make a histogram (count distribution frequency)
    values = [0] * 256
    for i in range(len(img)):
        for j in img[i]:
           values[j] += 1

这是一个经过一些修改的解决方案。它给出以下输出

原件:

均衡:

主要修改:

  • df()
    cdf()
    函数变得简单。执行时一定要打印他们的输出,以检查它是否与您期望的结果相符
  • equalize_image()
    函数通过从正常像素范围(即
    range(0256)
    )插值到累积分布函数来均衡图像
  • 代码如下:

    import cv2
    img = cv2.imread(raw_input('Please enter the name of your image:'),0) #The ',0' makes it read the image as a grayscale image
    row, col = img.shape[:2]
    
    
    def df(img):  # to make a histogram (count distribution frequency)
        values = [0]*256
        for i in range(img.shape[0]):
            for j in range(img.shape[1]):
                values[img[i,j]]+=1
        return values
    
    
    def cdf(hist):  # cumulative distribution frequency
        cdf = [0] * len(hist)   #len(hist) is 256
        cdf[0] = hist[0]
        for i in range(1, len(hist)):
            cdf[i]= cdf[i-1]+hist[i]
        # Now we normalize the histogram
        cdf = [ele*255/cdf[-1] for ele in cdf]      # What your function h was doing before
        return cdf
    
    def equalize_image(image):
        my_cdf = cdf(df(img))
        # use linear interpolation of cdf to find new pixel values. Scipy alternative exists
        import numpy as np
        image_equalized = np.interp(image, range(0,256), my_cdf)
        return image_equalized
    
    eq = equalize_image(img)
    cv2.imwrite('equalized.png', eq)
    

    非常感谢。将这些值附加到列表中以便我可以使用它来获得累积分布频率,这样做是否错误?将某些内容附加到列表中会将其作为新的最后一个元素添加到该列表中,即如果
    a=[5,2]
    a.append(6)
    会导致
    a=[5,2,6]
    。我不知道你打算怎么继续下去。累积被定义为所有先前元素和当前元素的总和,将所有元素总和到位置n的快速方法是
    sum(a[0:n])
    .FWIW,
    cv2。equalizeHist()
    设计用于灰度(即单通道)图像。如果您有彩色(3通道)图像,则需要更多的思考,请参阅。为了使其正常工作,您必须在代码中进行一些修改。我很快会发布答案。非常感谢!我已经贴了。如果你有任何疑问,请告诉我。如果它对你有帮助,请接受它作为答案:)非常感谢你!是否可以用h=((cdf(img)-1)/((row*col)-1))*255替换均衡器函数,因为我尝试在不导入numpy模块的情况下执行此操作。:)非常感谢你!是否可以用h=((cdf(img)-1)/((row*col)-1))*255替换均衡器函数,因为我正在尝试在不导入numpy模块的情况下执行此操作。scipy会执行@I.V.N吗?唯一使用numpy的地方是插值。我们可以很容易地用scipy插值代替numpy插值。可以用索引代替插值吗?