嗯可以敲代码了。首先这个算法是这样,我们首先要对原图片计算一个概率值。这个概率值反映了原图片中某个像素值的占比。比如之前的5个像素点例子,[122,122,141,155,177] 那P(122) = 2/5, 这个概率就反映了原图片中的每个像素点的分布情况。
然后我们由像素值从小到大的顺序,计算每个像素点的cdf,比如cdf(122) = 2/5, cdf(155) = p(122)+p(141)+p(155) = 4/5。计算cdf的原因是什么呢,是为了保持数据的顺序分布不被搞乱。
也就是说,整个算法的粗糙逻辑就是,我从原图片中,提取出像素点的大小逻辑,也就是cdf,然后新图片只要保持cdf,也就是这个大小逻辑跟原图片一样,这个新图片就不会乱走样。
所以得出原图片的cdf,就是生成图片的cdf。
然后用原图片的cdf*255/总像素点数就可以生成增强图片了。
代码具体如下,有问题可以评论留言我会回复的。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#读图片
data = cv.imread('3.PNG')
data = cv.cvtColor(data, cv.COLOR_BGR2GRAY)
n = data.shape[0]*data.shape[1]
plt.imshow(data)
#计算图片的每个像素值都有多少像素点
unique,count=np.unique(data,return_counts=True)
data_count=dict(zip(unique,count))
#生成一个字典,每个像素值都对应一个选中它这个像素点的概率
pik = {key:data_count[key]/n for key in data_count}
#计算原图片的cdf函数
cdf_a = cdf_calculator(pik)
num_grayvalue = len(pik.keys())
#生成目标图片对比度映射的字典
dict_vb = {key : vb_calculator(cdf_a[key],n , num_grayvalue) for key in pik }
#映射对比度,生成图片
recons_img = data.copy()
recons_img = recons_img.astype(float)
for row in range(data.shape[0]):
for col in range(data.shape[1]):
recons_img[row][col] = dict_vb[data[row][col]]
plt.imshow(recons_img)
#cdf计算方法
def cdf_calculator(pik):
cdf = pik.copy()
first_item_key = list(pik)[0]
for key in pik:
item_key = key.copy()
while item_key >= first_item_key:
cdf[key] += pik[item_key]
item_key -= 1
while item_key not in pik.keys() and item_key > first_item_key:
item_key -= 1
return cdf
def vb_calculator(cdf_a, n, num_grayvalue):
vb = (cdf_a*num_grayvalue)/n
return vb
网友评论