标题

  • 线性位置不变退化
  • 估计退化函数
    • 采用观察法估计退化函数
    • 采用试验法估计退化函数
    • 采用建模法估计退化函数
      • 运动模糊函数
      • OpenCV Motion Blur

在这一节中,得到的结果,有些不是很好,我需要再努力多找资料,重新完成学习,如果大佬有相关资料推荐,不胜感激。

线性位置不变退化

# 巴特沃斯带阻陷波滤波器 BNRF
img_temp = np.zeros([512, 512])
BNF_1 = butterworth_notch_resistant_filter(img_temp, radius=20, uk=-80, vk=60)
BNF_2 = butterworth_notch_resistant_filter(img_temp, radius=10, uk=30, vk=80)
BNF_3 = butterworth_notch_resistant_filter(img_temp, radius=10, uk=-30, vk=80)plt.figure(figsize=(16, 16))
plt.subplot(221), plt.imshow(BNF_1, 'gray'), plt.title('BNF_1')
plt.subplot(222), plt.imshow(BNF_2, 'gray'), plt.title('BNF_2')
plt.subplot(223), plt.imshow(BNF_3, 'gray'), plt.title('BNF_3')BNF_dst = BNF_1 * BNF_2 * BNF_3plt.subplot(224), plt.imshow(BNF_dst, 'gray'), plt.title('BNF_dst')plt.tight_layout()
plt.show()

估计退化函数

In this section, I think I still got some problem have to sort out, when I have some more time or some more reading.

采用观察法估计退化函数

选择一个信号内容很强的区域(如一个高对比度区域)表示为g(x,y)g(x, y)g(x,y),令f^(x,y)\hat{f}(x, y)f^​(x,y)表示为处理后的子图像,则有:
Hs(u,v)=Gs(u,v)F^s(u,v)(5.66)H_{s}(u, v) = \frac{G_{s}(u, v)}{\hat{F}_{s}(u, v)} \tag{5.66}Hs​(u,v)=F^s​(u,v)Gs​(u,v)​(5.66)

根据位置不变的假设来推断完整的退化函数H(u,v)H(u, v)H(u,v)

采用试验法估计退化函数

一个冲激由一个亮点来模拟,这个点应亮到能降低噪声对可忽略值的影响。一个冲激的傅里叶变换是一个常量:
H(u,v)=G(u,v)A(5.67)H(u, v) = \frac{G(u, v)}{A} \tag{5.67}H(u,v)=AG(u,v)​(5.67)

# 试验法估计退化函数
img_impulse = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0524(a)(impulse).tif", 0)
img_blurred = cv2.imread("DIP_Figures/DIP3E_Original_Images_CH05/Fig0524(b)(blurred-impulse).tif", 0)fig = plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1), plt.imshow(img_impulse, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(img_blurred, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()


下面两个例子,你会看到傅立叶变换后,频谱图像的美。把频谱图像上了颜色后,更是美极啦

# 傅里叶变换
fp_impulse = pad_image(img_impulse)
impluse_cen = centralized_2d(fp_impulse)
fft_impulse = np.fft.fft2(impluse_cen)
impulse_spectrume = np.log(1 + spectrum_fft(fft_impulse))fp_blurred = pad_image(img_blurred)
blurred_cen = centralized_2d(fp_blurred)
fft_blurred = np.fft.fft2(blurred_cen)
blurred_spectrum = np.log(1 + spectrum_fft(fft_blurred))H = fft_blurred / fft_impulseh_spectrum = np.log(1 + spectrum_fft(H))
h_spectrum = h_spectrum / h_spectrum.max()fig = plt.figure(figsize=(15, 5))
plt.subplot(1, 3, 1), plt.imshow(impulse_spectrume, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(blurred_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(h_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 一些傅里叶变换
img_temp = np.zeros([256, 256])
# H = butterworth_low_pass_filter(img_temp, 10, 500)
H = 1 - butterworth_band_resistant_filter(img_temp, img_temp.shape, radius=50, w=5, n=5)
fp_blurred = pad_image(H)
blurred_cen = centralized_2d(fp_blurred)
fft_blurred = np.fft.fft2(blurred_cen)
blurred_spectrum = np.log(1 + spectrum_fft(fft_blurred))fig = plt.figure(figsize=(15, 15))
plt.imshow(blurred_spectrum, cmap='PiYG'), plt.xticks([]), plt.yticks([])
# plt.savefig("bbrf_4.png", dpi=300, quality=100)
# plt.subplot(1, 3, 1), plt.imshow(impulse_spectrume, cmap='gray'), plt.xticks([]), plt.yticks([])
# plt.subplot(1, 3, 2), plt.imshow(blurred_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
# # plt.subplot(1, 3, 3), plt.imshow(h_spectrum, cmap='gray'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

采用建模法估计退化函数

H(u,v)=e−k(u2+v2)56(5.68)H(u,v) = e^{-k(u^2 + v^2)^{\frac{5}{6}}} \tag{5.68}H(u,v)=e−k(u2+v2)65​(5.68)

关于频率矩形的中心,可用如下函数
H(u,v)=e−k((u−P/2)2+(v−Q/2)2)56H(u, v) = e^{-k((u - P/2)^2 + (v - Q/2)^2 \ \ )^{\frac{5}{6}}}H(u,v)=e−k((u−P/2)2+(v−Q/2)2  )65​

参加书上P247页,运动导的图像模糊的退化过程,是否用错?
这个问题已经得到解决啦,解决方案如下。

def modeling_degrade(img, k=1):"""modeling degradation fuction, math: $$H(u,v) = e^{-k(u^2 +v^2)^{\frac{5}{6}}}$$param: img: input imgparam: k: """N, M = img.shape[:2]u = np.arange(M)v = np.arange(N)u, v = np.meshgrid(u, v)temp = (u - M//2)**2 + (v - N//2)**2kernel = np.exp(-k * np.power(temp, 5/6))return kernel
# 不填充,结果与书上一致啦
def get_degenerate_image(img, img_deg):"""不填充图像做傅里叶变换后与退化函数做乘积,再反傅里叶变换"""# FFT--------------------------------------------fft = np.fft.fft2(img)# FFT * H(u, v)----------------------------------fft_huv = fft * img_deg# IFFT-------------------------------------------ifft = np.fft.ifft2(fft_huv)return ifftimg_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0525(a)(aerial_view_no_turb).tif', 0)# k = [1, 0.1, 0.01, 0.001, 0.0025, 0.00025]
k = [0.0025, 0.001, 0.00025]fp_cen = centralized_2d(img_ori)fig = plt.figure(figsize=(12, 12))
for i in range(len(k) + 1):ax = fig.add_subplot(2, 2, i+1, xticks=[], yticks=[])if i == 0:ax.imshow(img_ori, 'gray'), ax.set_title(f"Original")else:img_deg = modeling_degrade(fp_cen, k=k[i-1])ifft = get_degenerate_image(fp_cen, img_deg)img_new = centralized_2d(ifft.real)img_new = np.clip(img_new, 0, img_new.max())img_new = np.uint8(normalize(img_new) * 255)ax.imshow(img_new, 'gray')ax.set_title(f"k = {k[i-1]}")
plt.tight_layout()
plt.show()

运动模糊函数

H(u,v)=Tπ(ua+vb)sin[π(ua+vb)]e−jπ(ua+vb)H(u,v) =\frac{T}{\pi(ua + vb)}sin[\pi(ua+vb)]e^{-j\pi(ua+vb)}H(u,v)=π(ua+vb)T​sin[π(ua+vb)]e−jπ(ua+vb)

下面的代码可能比较混乱,因为实验过程,而得出的结果不太好,还没有整理。需要继续学习后,再完成整理。

img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)
def motion_huv(img, a, b, T):eps = 1e-8M, N = img.shape[1], img.shape[0]u = np.arange(1, M+1)v = np.arange(1, N+1)u, v = np.meshgrid(u, v)temp = np.pi * (u * a + v * b)kernel = (T * np.sin(temp) * np.exp(-temp*1j) /(temp + eps))return kernel
# 对图片进行运动模糊
def make_blurred(img, PSF, eps):#=====================
#     fft = np.fft.fft2(img)
# #     fft_shift = np.fft.fftshift(fft)#     fft_psf = fft * PSF#     ifft = np.fft.ifft2(fft_psf)
# #     ifft_shift = np.fft.ifftshift(ifft)
#     blurred = abs(ifft.real)#=========================M, N = img.shape[:2]fp = pad_image(img, mode='constant')fp_cen = centralized_2d(fp)img_fft = np.fft.fft2(fp_cen)img_fft_psf = img_fft * PSFifft = np.fft.ifft2(img_fft_psf)blurred = centralized_2d(ifft.real)[:N, :M]
# #     blurred = ifft.real[:N, :M]return blurred
def get_motion_dsf(image_size, motion_angle, motion_dis):PSF = np.zeros(image_size)  # 点扩散函数x_center = (image_size[0] - 1) / 2y_center = (image_size[1] - 1) / 2sin_val = np.sin(motion_angle * np.pi / 180)cos_val = np.cos(motion_angle * np.pi / 180)# 将对应角度上motion_dis个点置成1for i in range(motion_dis):x_offset = round(sin_val * i)y_offset = round(cos_val * i)PSF[int(x_center - x_offset), int(y_center + y_offset)] = 1return PSF / PSF.sum()    # 归一化
img_motion = get_motion_dsf((480, 480), 70, 200)plt.figure(figsize=(10, 8))
plt.subplot(121), plt.imshow(img_motion,'gray'), plt.title('img_motion')
plt.show()

OpenCV Motion Blur

def motion_blur(image, degree=12, angle=45):"""create motion blur using opencvparam: image: input imageparam: degree: the size of the blurryparam: angle: blur anglereturn uint8 image"""image = np.array(image)# 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)motion_blur_kernel = np.diag(np.ones(degree))motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))motion_blur_kernel = motion_blur_kernel / degreeblurred = cv2.filter2D(image, -1, motion_blur_kernel)# convert to uint8cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)blurred = np.array(blurred, dtype=np.uint8)return blurred
# 运动模糊图像
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)img_blur = motion_blur(img_ori, degree=75, angle=15)plt.figure(figsize=(12, 8))
plt.subplot(121), plt.imshow(img_ori,'gray'), plt.title('img_deg')
plt.subplot(122), plt.imshow(img_blur,'gray'), plt.title('high_pass')
plt.show()

第5章 Python 数字图像处理(DIP) - 图像复原与重建13 - 空间滤波 - 线性位置不变退化 - 退化函数估计、运动模糊函数相关推荐

  1. 第5章 Python 数字图像处理(DIP) - 图像复原与重建12 - 空间滤波 - 使用频率域滤波降低周期噪声 - 陷波滤波、最优陷波滤波

    标题 使用频率域滤波降低周期噪声 陷波滤波深入介绍 最优陷波滤波 本章陷波滤波器有部分得出的结果不佳,如果有更好的解决方案,请赐教,不胜感激. 使用频率域滤波降低周期噪声 陷波滤波深入介绍 零相移滤波 ...

  2. 第5章 Python 数字图像处理(DIP) - 图像复原与重建11 - 空间滤波 - 自适应滤波器 - 自适应局部降噪、自适应中值滤波器

    标题 自适应滤波器 自适应局部降噪滤波器 自适应中值滤波器 自适应滤波器 自适应局部降噪滤波器 均值是计算平均值的区域上的平均灰度,方差是该区域上的图像对比度 g(x,y)g(x, y)g(x,y)噪 ...

  3. 第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器

    标题 统计排序滤波器 中值.最大值.最小值.中点 滤波器 修正阿尔法均值滤波器 统计排序滤波器 中值.最大值.最小值.中点 滤波器 f^(x,y)=median{g(r,c)}(5.27)\hat{f ...

  4. 第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

    标题 只存在噪声的复原 - 空间滤波 均值滤波器 算术平均滤波器 几何均值滤波器 谐波平均滤波器 反(逆)谐波平均滤波器 只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)=f(x,y)+ ...

  5. 第5章 Python 数字图像处理(DIP) - 图像复原与重建1 - 高斯噪声

    本章主要讲图像复原与重建,首先是了解一下各种噪声的特点与模型,还有形成的方法.一些重点的噪声,如高斯噪声,均匀噪声,伽马噪声,指数噪声,还有椒盐噪声等. 本章主要的噪声研究方法主要是加性噪声. 标题 ...

  6. 第5章 Python 数字图像处理(DIP) - 图像复原与重建17 - 由投影重建图像、雷登变换、投影、反投影、反投影重建

    标题 由投影重建图像 投影和雷登变换 Johann Radon 反投影 滤波反投影重建 由投影重建图像 本由投影重建图像,主要是雷登变换与雷登把变换的应用,所以也没有太多的研究,只为了保持完整性,而添 ...

  7. 第5章 Python 数字图像处理(DIP) - 图像复原与重建16 - 约束最小二乘方滤波、几何均值滤波

    标题 约束最小二乘方滤波 几何均值滤波 约束最小二乘方滤波 F^(u,v)=[H∗(u,v)∣H(u,v)∣2+γ∣P(u,v)∣2]G(u,v)(5.89)\hat{F}(u,v) = \bigg[ ...

  8. 第5章 Python 数字图像处理(DIP) - 图像复原与重建15 - 最小均方误差(维纳)滤波

    标题 最小均方误差(维纳)滤波 最小均方误差(维纳)滤波 目标是求未污染图像fff的一个估计f^\hat{f}f^​,使它们之间的均方误差最小. e2=E{(f−f^)2}(5.80)e^2 = E ...

  9. 第5章 Python 数字图像处理(DIP) - 图像复原与重建14 - 逆滤波

    标题 逆滤波 逆滤波 逆滤波 逆滤波 图像的退化函数已知或者由前面的方法获取退化函数,则可以直接逆滤波 F^(u,v)=G(u,v)H(u,v)(5.78)\hat{F}(u,v) = \frac{G ...

最新文章

  1. “万人迷”小冰背后的AI故事
  2. 使用Solr构建企业级的全文检索(三)---------Schema定义
  3. 谷歌网络代理工具_谷歌更新了Dialogflow AI引擎,帮助客户创建更好的虚拟代理...
  4. 使用carbon_东华大学《Carbon》多孔碳纳米纤维复合膜,优异电磁波吸收性能!
  5. JavaScript词法作用域和动态作用域
  6. [转载]未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。
  7. Bug人生---初看windows核心编程有感
  8. like效率 regexp_Oracle中REGEXP_LIKE与LIKE的区别
  9. 软件工程毕设(三)·进度考核表
  10. 《初级会计电算化实用教程(金蝶KIS专业版)》一1.4 会计核算软件
  11. 整理优秀的网盘搜索合集
  12. 机器人动力学建模之刚体动力学基础学习
  13. 2021-07-26
  14. 2.3 The 10-armed Testbed 10摇臂老虎机试验台
  15. F28335学习之GPIO配置
  16. excel两列数据对比找不同_技巧不求人168期 Excel两列数据找不同的3种方法 Word快速更改文本排序...
  17. 腾讯面试:我倒在了网络基础知识
  18. ACM Plan UVa - 11902 Dominator(图的遍历,深度优先)
  19. 上海市居住证积分提交材料
  20. 社会实践分组(c++)

热门文章

  1. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
  2. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)
  3. node --- 模拟express实现一个简单的服务器
  4. asp.net model 验证和取出 ErrorMessage 信息
  5. React Native中pointerEvent属性
  6. 正整数分解为几个连续自然数之和
  7. Go语言在扫码支付系统中的成功实践
  8. 《编程原本 》一3.3 程序变换
  9. 用phpmyadmin更改root密码的方法
  10. 在XenApp如何发布SAP的客户端(上)