前言
选修的是蔡mj老师的计算机视觉,上课还是不错的,但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学,这门课最后混了80多分,所以下面作业解题过程均为自己写的,并不是标准答案,仅供参考
任务1
修改test.py的task_one()函数,对task1.jpg进行去噪处理,处理结果保存为task1_proc.jpg
提示:请观察分析task1.jpg的噪声特点,并选择合适的处理方法
def task_one():
img = cv2.imread('task1.jpg')
#---------your code-----------------#
median = cv2.medianBlur(img, 3)
#---------draw figures--------------#
plt.imshow(cv2.cvtColor(median, cv2.COLOR_BGR2RGB)),plt.title('task1 output')
plt.show()
#---------save figures--------------#
cv2.imwrite("task1_proc.jpg", median)
效果如下:
任务2
修改test.py的task_two()函数,对task2.jpg进行去噪处理,处理结果保存为task2_proc.jpg
提示:请观察分析task2.jpg的噪声特点,并选择合适的处理方法
def task_two():
img = cv2.imread('task2.jpg')
#---------your code-----------------#
blur = cv2.bilateralFilter(img,5,50,50)
#---------draw figures--------------#
#plt.imshow(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB)),plt.title('task2 output')
#plt.show()
#---------save figures--------------#
cv2.imwrite("task2_proc.jpg", blur)
效果如下:
任务3
修改test.py的task_three()函数,对task3.jpg进行去噪处理,处理结果保存为task3_proc.jpg
提示:task3.jpg中的噪声为y轴方向的周期噪声,周期为图像高度(height)的1/10
这个不会做,弄了半天
def task_three():
#img = cv2.imread('task3.jpg',1)
#---------your code-----------------#
# 读取图像
img = cv2.imread('task3.jpg')
# 分离RGB通道
b, g, r = cv2.split(img)
# 对每个通道进行傅里叶变换
fb = np.fft.fft2(b)
fg = np.fft.fft2(g)
fr = np.fft.fft2(r)
# 将频域中的原点移动到图像中心
fb_shift = np.fft.fftshift(fb)
fg_shift = np.fft.fftshift(fg)
fr_shift = np.fft.fftshift(fr)
# 获取频谱图像
magnitude_spectrum_b = 20 * np.log(np.abs(fb_shift))
magnitude_spectrum_g = 20 * np.log(np.abs(fg_shift))
magnitude_spectrum_r = 20 * np.log(np.abs(fr_shift))
# 获取图像高度
height, width = img.shape[:2]
# 计算周期噪声的频率成分
dft_height = np.ceil(height / 10)
cy = np.arange(dft_height, height, dft_height)
cx = np.arange(width)
# 将周期噪声的频率成分设置为0
for y in cy:
fb_shift[int(y) - 1:int(y) + 1, :] = 0
fg_shift[int(y) - 1:int(y) + 1, :] = 0
fr_shift[int(y) - 1:int(y) + 1, :] = 0
# 进行反傅里叶变换,得到去噪后的图像
ib = np.fft.ifft2(np.fft.ifftshift(fb_shift))
ig = np.fft.ifft2(np.fft.ifftshift(fg_shift))
ir = np.fft.ifft2(np.fft.ifftshift(fr_shift))
# 将每个通道的结果合并为一张去噪后的彩色图像
denoised_img = cv2.merge((ib.real, ig.real, ir.real))
#---------draw figures--------------#
#plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)),plt.title('task3 output')
#plt.show()
#---------save figures--------------#
cv2.imwrite("task3_proc.jpg", denoised_img)
效果和原图没啥区别。。。
源代码:
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 31 14:51:59 2023
@author: cai-mj
"""
import numpy as np
import cv2
from matplotlib import pyplot as plt
def task_one():
img = cv2.imread('task1.jpg')
#---------your code-----------------#
median = cv2.medianBlur(img, 3)
#---------draw figures--------------#
plt.imshow(cv2.cvtColor(median, cv2.COLOR_BGR2RGB)),plt.title('task1 output')
plt.show()
#---------save figures--------------#
cv2.imwrite("task1_proc.jpg", median)
def task_two():
img = cv2.imread('task2.jpg')
#---------your code-----------------#
blur = cv2.bilateralFilter(img,5,50,50)
#---------draw figures--------------#
#plt.imshow(cv2.cvtColor(blur, cv2.COLOR_BGR2RGB)),plt.title('task2 output')
#plt.show()
#---------save figures--------------#
cv2.imwrite("task2_proc.jpg", blur)
def task_three():
#img = cv2.imread('task3.jpg',1)
#---------your code-----------------#
# 读取图像
img = cv2.imread('task3.jpg')
# 分离RGB通道
b, g, r = cv2.split(img)
# 对每个通道进行傅里叶变换
fb = np.fft.fft2(b)
fg = np.fft.fft2(g)
fr = np.fft.fft2(r)
# 将频域中的原点移动到图像中心
fb_shift = np.fft.fftshift(fb)
fg_shift = np.fft.fftshift(fg)
fr_shift = np.fft.fftshift(fr)
# 获取频谱图像
magnitude_spectrum_b = 20 * np.log(np.abs(fb_shift))
magnitude_spectrum_g = 20 * np.log(np.abs(fg_shift))
magnitude_spectrum_r = 20 * np.log(np.abs(fr_shift))
# 获取图像高度
height, width = img.shape[:2]
# 计算周期噪声的频率成分
dft_height = np.ceil(height / 10)
cy = np.arange(dft_height, height, dft_height)
cx = np.arange(width)
# 将周期噪声的频率成分设置为0
for y in cy:
fb_shift[int(y) - 1:int(y) + 1, :] = 0
fg_shift[int(y) - 1:int(y) + 1, :] = 0
fr_shift[int(y) - 1:int(y) + 1, :] = 0
# 进行反傅里叶变换,得到去噪后的图像
ib = np.fft.ifft2(np.fft.ifftshift(fb_shift))
ig = np.fft.ifft2(np.fft.ifftshift(fg_shift))
ir = np.fft.ifft2(np.fft.ifftshift(fr_shift))
# 将每个通道的结果合并为一张去噪后的彩色图像
denoised_img = cv2.merge((ib.real, ig.real, ir.real))
#---------draw figures--------------#
#plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB)),plt.title('task3 output')
#plt.show()
#---------save figures--------------#
cv2.imwrite("task3_proc.jpg", denoised_img)
if __name__ == '__main__':
task_one()
task_two()
task_three()