这种图片太模糊,如何在python语法使鱼刺变得清晰?我试过拉普拉斯算子,但是效果很差噪音过大,能否指出合适的方法?
如何使用python实现图像锐化
这种图片太模糊,如何在python语法使鱼刺变得清晰?我试过拉普拉斯算子,但是效果很差噪音过大,能否指出合适的方法?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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无用
悬赏问题
- ¥200 csgo2的viewmatrix值是否还有别的获取方式
- ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
- ¥15 请把下列每一行代码完整地读懂并注释出来
- ¥15 pycharm运行main文件,显示没有conda环境
- ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
- ¥15 为什么eclipse不能再下载了?
- ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
- ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
- ¥15 特定网页无法访问,已排除网页问题
- ¥50 如何将脑的图像投影到颅骨上