数字图像处理冈萨雷斯版-图像增强篇)

内容简介

直方图均衡增强

直方图均衡是提高图像对比度达到图像增强的目的,即使得均衡后的图像像素值大体均匀分布在0-255之间 大体分3步

  1. 统计每个像素值所对应的个数
  2. 计算每个像素值所对应的累计概率
  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 自带直方图均衡对比如下:
在这里插入图片描述

空间域算子增强

在图像增强中除了直方图均衡以外大体的思路有大体两类

  1. g = f + k * s
    g 为增强后的图像
    f 为原图
    s 为锐化图像(如常见的拉普拉斯算子等一系列边缘提取的算子)
    k常数系数
  2. 使锐化算子中心处的权重增加,这样使得在平滑区域时为原像素值,在锐化区域内达到增大像素值的目的使得整体细节增强

目前做增强或者只做锐化的常见做法差别,

  1. 拉普拉斯算子,缺点主要有在噪声处进行二阶差分使会使得噪声放大
    改进做法为LOG算子,

  2. LOG算子,高斯拉普拉斯算子,即在做拉普拉斯之前先进行高斯平滑去除噪声干扰,

  3. 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步

  1. 得到图像的傅立叶谱(中心化后)
  2. 高通滤波处理
  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种类型的只是其中最为简单的容易理解的,针对其他的还有去噪声,光照问题等所使用的去噪算法,以及例如同态滤波,以及去雾等算法对图像的增强等在后面的文章将会涉及到

最后谢谢读者的阅读,希望对您能有所帮助
转载我博客应当经我允许,至少要把原文链接放在文章最前面,这是对本人辛苦原创基本的尊重。

发布了2 篇原创文章 · 获赞 0 · 访问量 326

猜你喜欢

转载自blog.csdn.net/ab136681/article/details/104221777