计算机视觉传统技术-直方图均衡(2)

2020-08-10  本文已影响0人  Kyle_1091

嗯可以敲代码了。首先这个算法是这样,我们首先要对原图片计算一个概率值。这个概率值反映了原图片中某个像素值的占比。比如之前的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
上一篇 下一篇

猜你喜欢

热点阅读