13059l 2022-07-19 15:07 采纳率: 70.6%
浏览 110
已结题

如何使用python实现图像锐化

img


这种图片太模糊,如何在python语法使鱼刺变得清晰?我试过拉普拉斯算子,但是效果很差噪音过大,能否指出合适的方法?

  • 写回答

2条回答 默认 最新

  • YoungGeeker 2022-07-19 15:17
    关注

    可以看这个:实验四 图像频域平滑与锐化(Python实现)_ReadyGo!!!的博客-CSDN博客_python图像锐化

    import random
    import numpy as np
    import matplotlib.pyplot as plt
     
     
    def sp_noise(image, prob):
        """
        添加椒盐噪声
        prob:噪声比例
        """
        output = np.zeros(image.shape, np.uint8)
        thres = 1 - prob
        for i in range(image.shape[0]):
            for j in range(image.shape[1]):
                rdn = random.random()
                if rdn < prob:
                    output[i][j] = 0
                elif rdn > thres:
                    output[i][j] = 255
                else:
                    output[i][j] = image[i][j]
        return output
     
     
    def ideal_low_filter(img, D0):
        """
        生成一个理想低通滤波器(并返回)
        """
        h, w = img.shape[:2]
        filter_img = np.ones((h, w))
        u = np.fix(h / 2)
        v = np.fix(w / 2)
        for i in range(h):
            for j in range(w):
                d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
                filter_img[i, j] = 0 if d > D0 else 1
        return filter_img
     
     
    def butterworth_low_filter(img, D0, rank):
        """
            生成一个Butterworth低通滤波器(并返回)
        """
        h, w = img.shape[:2]
        filter_img = np.zeros((h, w))
        u = np.fix(h / 2)
        v = np.fix(w / 2)
        for i in range(h):
            for j in range(w):
                d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
                filter_img[i, j] = 1 / (1 + 0.414 * (d / D0) ** (2 * rank))
        return filter_img
     
     
    def exp_low_filter(img, D0, rank):
        """
            生成一个指数低通滤波器(并返回)
        """
        h, w = img.shape[:2]
        filter_img = np.zeros((h, w))
        u = np.fix(h / 2)
        v = np.fix(w / 2)
        for i in range(h):
            for j in range(w):
                d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
                filter_img[i, j] = np.exp(np.log(1 / np.sqrt(2)) * (d / D0) ** (2 * rank))
        return filter_img
     
     
    def filter_use(img, filter):
        """
        将图像img与滤波器filter结合,生成对应的滤波图像
        """
        # 首先进行傅里叶变换
        f = np.fft.fft2(img)
        f_center = np.fft.fftshift(f)
        # 应用滤波器进行反变换
        S = np.multiply(f_center, filter)  # 频率相乘——l(u,v)*H(u,v)
        f_origin = np.fft.ifftshift(S)  # 将低频移动到原来的位置
        f_origin = np.fft.ifft2(f_origin)  # 使用ifft2进行傅里叶的逆变换
        f_origin = np.abs(f_origin)  # 设置区间
        return f_origin
     
     
    def DFT_show(img):
        """
        对传入的图像进行傅里叶变换,生成频域图像
        """
        f = np.fft.fft2(img)  # 使用numpy进行傅里叶变换
        fshift = np.fft.fftshift(f)  # 把零频率分量移到中间
        result = np.log(1 + abs(fshift))
        return result
     
     
    # %%自生成实验图像,并添加椒盐噪声
    src = np.zeros((300, 300), dtype=np.uint8)
    salt_area1 = np.ones((130, 130), dtype=np.uint8)
    salt_area1 = sp_noise(salt_area1, 0.04)
    salt_area2 = np.zeros((130, 130), dtype=np.uint8)
    salt_area2 = sp_noise(salt_area2, 0.04)
    for i in range(10, 140):
        for j in range(10, 140):
            src[i, j + 75] = 255
            src[i + 150, j] = salt_area1[i - 10, j - 10] * 255
            src[i + 150, j + 150] = salt_area2[i - 10, j - 10]
    my_img = src.copy()
     
    # %%——1.理想低通滤波——
    ideal_filter = ideal_low_filter(my_img, D0=40)  # 生成理想低通滤波器
    ideal_img = filter_use(my_img, ideal_filter)  # 将滤波器应用到图像,生成理想低通滤波图像
    fre_img = DFT_show(my_img)  # 原图的频域图像
    fre_ideal_img = DFT_show(ideal_img)  # 理想低通滤波图像的频域图像
    plt.figure(dpi=300)
    plt.subplot(221)
    plt.title('原图')
    plt.imshow(my_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(222)
    plt.title("理想低通滤波图像")
    plt.imshow(ideal_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(223)
    plt.title('原图频域图')
    plt.imshow(fre_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(224)
    plt.title("理想低通滤波图像的频域图")
    plt.imshow(fre_ideal_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.show()
     
    # %% ——2.巴特沃斯低通滤波器——
    my_img = src.copy()
    butterworth_filter = butterworth_low_filter(my_img, D0=10, rank=2)  # 生成Butterworth低通滤波器
    butterworth_img = filter_use(my_img, butterworth_filter)  # 将滤波器应用到图像,生成Butterworth低通滤波图像
    fre_butterworth_img = DFT_show(butterworth_img)  # Butterworth低通滤波图像的频域图像
    plt.figure(dpi=300)
    plt.subplot(221)
    plt.title('原图')
    plt.imshow(my_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(222)
    plt.title("Butterworth低通滤波图像")
    plt.imshow(butterworth_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(223)
    plt.title('原图频域图')
    plt.imshow(fre_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(224)
    plt.title("Butterworth低通滤波图像的频域图")
    plt.imshow(fre_butterworth_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.show()
     
    # %% ——3.指数低通滤波器——
    my_img = src.copy()
    exp_filter = exp_low_filter(my_img, D0=20, rank=2)  # 生成指数低通滤波器
    exp_img = filter_use(my_img, exp_filter)  # 将滤波器应用到图像,生成指数低通滤波图像
    fre_exp_img = DFT_show(exp_img)  # 指数低通滤波图像的频域图像
    plt.figure(dpi=300)
    plt.subplot(221)
    plt.title('原图')
    plt.imshow(my_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(222)
    plt.title("指数低通滤波图像")
    plt.imshow(exp_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(223)
    plt.title('原图频域图')
    plt.imshow(fre_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.subplot(224)
    plt.title("指数低通滤波图像的频域图")
    plt.imshow(fre_exp_img, cmap=plt.cm.gray)
    plt.axis("off")
    plt.show()
    

    如果没有上面这些库,可以用 pip3 install xxx 来安装。
    望采纳。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月27日
  • 已采纳回答 7月27日
  • 修改了问题 7月19日
  • 创建了问题 7月19日

悬赏问题

  • ¥15 ghpython这里总是报错而且rhino视图窗口内不显示怎么办
  • ¥15 布尔运算推导,请证明
  • ¥15 有没有人会打学生成绩管理系统呀
  • ¥15 在使用Fiddler和夜神模拟器抓包的时候一直出现443该怎么办啊QAQ搜了好几个笔记都没有解决
  • ¥15 3x7的二维数组A、B、C,A中的任意1个数组元素与B的任意1个数组元素、同时又与C的任意1个数组元素比较,把不同位置出现相同数的比较称为无意义,反之称为有意义,把有意义的比较打印输出。
  • ¥20 预测模型怎么处理原始数据(随机森林)
  • ¥20 请问discuz3.5如何实现插入ckplayer全能播放器功能呢?
  • ¥15 thingsboard代码编译出错误
  • ¥15 博途v18仿真报错怎么解决
  • ¥15 欧姆龙plc枕式包装机 ST编程