выравнивание гистограммы с использованием python и opencv без использования встроенных функций - PullRequest
0 голосов
/ 29 мая 2018

Я использовал формулу: ((L-1) / MN) ni, где L - общее количество уровней градации, M N - размер изображения, 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()

Я прилагаю изображение это изображение, которое я использовал

1 Ответ

0 голосов
/ 29 мая 2018

Шаг выравнивания реализован несколько некорректно.Вычисление функции распределения вероятности (PDF) должно соответствовать числу бинов, а не ширине изображения (хотя в данном конкретном случае они равны).См. Следующий код с исправленной реализацией шага выравнивания.

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.

...