【问题标题】:histogram equalization using python and opencv without using inbuilt functions使用python和opencv进行直方图均衡而不使用内置函数
【发布时间】:2018-05-29 07:38:51
【问题描述】:

我使用了公式: ((L-1)/MN)ni 在哪里 L是灰度总数,MN是图像大小,ni是累积频率

但我总是得到全黑图像。我也尝试过其他图像。

import numpy as np
import cv2

path="C:/Users/Arun Nambiar/Downloads/fingerprint256by256 (1).pgm"
img=cv2.imread(path,0)

#To display image before equalization
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()


a=np.zeros((256,),dtype=np.float16)
b=np.zeros((256,),dtype=np.float16)
height,width=img.shape

#finding histogram
for i in range(width):
    for j in range(height):
    g=img[j,i]
    a[g]=a[g]+1
print(a)        


#performing histogram equalization

tmp=255/(height*width)

a[0]=tmp*a[0]
b[0]=round(a[0])

for g in range(1,width):
   a[g]=(a[g]*tmp)+(a[g-1]*tmp)
   b[g]=round(a[g])



print(b)


b=b.astype(np.uint8)
print(b)
for i in range(width):
    for j in range(height):
        g=img[j,i]
        img[j,i]=b[g]

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我附上图片this is image i have used

【问题讨论】:

    标签: python-3.x opencv image-processing histogram


    【解决方案1】:

    均衡步骤的执行有些不正确。概率分布函数 (PDF) 的计算应该取决于 bin 的数量而不是图像宽度(尽管在这种特定情况下它们是相等的)。请参阅以下代码以及均衡步骤的正确实现。

    import numpy as np
    import cv2
    
    path = "fingerprint256by256.pgm"
    img = cv2.imread(path,0)
    
    #To display image before equalization
    cv2.imshow('image',img)
    cv2.waitKey(0)
    
    
    a = np.zeros((256,),dtype=np.float16)
    b = np.zeros((256,),dtype=np.float16)
    
    height,width=img.shape
    
    #finding histogram
    for i in range(width):
        for j in range(height):
            g = img[j,i]
            a[g] = a[g]+1
    
    print(a)   
    
    
    #performing histogram equalization
    tmp = 1.0/(height*width)
    b = np.zeros((256,),dtype=np.float16)
    
    for i in range(256):
        for j in range(i+1):
            b[i] += a[j] * tmp;
        b[i] = round(b[i] * 255);
    
    # b now contains the equalized histogram
    b=b.astype(np.uint8)
    
    print(b)
    
    #Re-map values from equalized histogram into the image
    for i in range(width):
        for j in range(height):
            g = img[j,i]
            img[j,i]= b[g]
    
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    在 Ubuntu 14.04 上使用 Python 3.4 和 OpenCV 3.4 进行测试和验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多