直方图均衡是提高图像对比度达到图像增强的目的,即使得均衡后的图像像素值大体均匀分布在0-255之间 大体分3步
def myEqualizeHist(I):
rows, cols = I.shape
array = np.zeros(256)
# 统计像素个数
for i in range(rows):
for j in range(cols):
array[I[i][j]] += 1
# 算累计概率
sum = 0
for ary in range(0, len(array)):
sum += array[ary] / (rows * cols)
array[ary] = sum
# 求均衡化后的像素值
newI = np.zeros(I.shape)
for i in range(rows):
for j in range(cols):
newI[i][j] = array[I[i][j]] * 255
return newI
与opencv 自带直方图均衡对比如下:
在图像增强中除了直方图均衡以外大体的思路有大体两类
目前做增强或者只做锐化的常见做法差别,
拉普拉斯算子,缺点主要有在噪声处进行二阶差分使会使得噪声放大
改进做法为LOG算子,
LOG算子,高斯拉普拉斯算子,即在做拉普拉斯之前先进行高斯平滑去除噪声干扰,
DOG算子 ,即差分高斯算子,即两个高斯算子差算子,等价做法为对高斯函数进行拉普拉斯再进行卷积,是对LOG算子的优化更符合人的视觉特性
这里使用常见的拉普拉斯算子作为例子进行讲解
代码如下
def laplacianEnhance(f):
rows, cols = f.shape
f = np.array(f)
newI = np.zeros(f.shape, dtype=np.float)
mask = np.array([-2, 0, -2, 0, 8, 0, -2, 0, -2]).reshape(3, 3)
for i in range(1, rows - 1):
for j in range(1, cols - 1):
newI[i][j] = np.sum(np.dot(f[i - 1:i + 2, j - 1:j + 2], mask))
newI = newI.clip(0, 255)
return newI
与opencv自带拉普拉斯增强效果如下,这里的效果差别为使用的模版与opencv的默认模版不一致导致的
频率域 g = f + s 其中s为高通图像(锐化图像)大体分为3步
代码如下
def enhance(f):
rows, cols = f.shape
f_mask = np.zeros(f.shape)
original = np.zeros(f.shape)
# 中心化预处理
for i in range(f.shape[0]):
for j in range(f.shape[1]):
original[i, j] = f[i, j] * ((-1) ** (i + j))
F = np.fft.fft2(original)
# 生成高通滤波模板
D0 = 20
for i in range(rows):
for j in range(cols):
temp = (i - rows / 2) ** 2 + (j - cols / 2) ** 2
f_mask[i, j] = 1 - np.e ** (-1 * temp / (2 * D0 ** 2))
return np.abs(np.fft.ifft2(F * f_mask))
def show(f, s, a, b, c):
plt.subplot(a, b, c)
plt.imshow(f, "gray")
plt.axis('on')
plt.title(s)
def main():
f = enhance(original)
plt.figure()
show(original, "original", 2, 2, 1)
show(f, "shape", 2, 2, 2)
ret, dst = cv.threshold(f + original, 255, 255, cv.THRESH_TRUNC)
show(dst, "enhance", 2, 2, 3)
plt.show()
效果如下:
以上3种类型的只是其中最为简单的容易理解的,针对其他的还有去噪声,光照问题等所使用的去噪算法,以及例如同态滤波,以及去雾等算法对图像的增强等在后面的文章将会涉及到
最后谢谢读者的阅读,希望对您能有所帮助
转载我博客应当经我允许,至少要把原文链接放在文章最前面,这是对本人辛苦原创基本的尊重。
上一篇:数字图像处理学习路线大体介绍
下一篇:数字图像处理冈萨雷斯-形态学处理