直方图均衡 Python(没有 Numpy 也没有绘图)
Histogram Equalization Python (No Numpy and No Plotting)
我正在尝试编写一个代码来增加灰度图像的对比度,使它们更清晰。我似乎无法让这段代码工作。我正在尝试获取像素中每个值的分布频率(除了 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 提供了一个用于直方图均衡化的内置函数,记录在案 here。
另外关于您的代码:
分布频率(或直方图)计算不正确,因为您只计算图像中出现的颜色频率。您应该计算所有颜色值的出现次数,即使它们没有出现。
同样,每次您的颜色重新出现时,您都会在列表中添加该颜色的新元素,这没有多大意义。我不太确定 +=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(0,256)
)内插到您的累积分布函数来均衡图像
代码如下:
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)
我正在尝试编写一个代码来增加灰度图像的对比度,使它们更清晰。我似乎无法让这段代码工作。我正在尝试获取像素中每个值的分布频率(除了 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 提供了一个用于直方图均衡化的内置函数,记录在案 here。
另外关于您的代码:
分布频率(或直方图)计算不正确,因为您只计算图像中出现的颜色频率。您应该计算所有颜色值的出现次数,即使它们没有出现。 同样,每次您的颜色重新出现时,您都会在列表中添加该颜色的新元素,这没有多大意义。我不太确定 +=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(0,256)
)内插到您的累积分布函数来均衡图像
代码如下:
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)