根据运动模型生成运动模糊图像
由于目标或摄像头运动,会使成像变得模糊,这种运动可以采用模型的方式加以描述,从而采用仿真的方法对清晰图像加以运动模糊,形成模糊图像,并可用于其后的运动模糊图像恢复。
先使用python将图像转换为txt文件
import cv2
img = cv2.imread('1.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 获取灰度图像的宽高
height, width = gray_img.shape
# 遍历灰度图像的每个像素,并将像素值转换为字符串
pixel_str = ''
for i in range(height):
for j in range(width):
pixel_str += str(gray_img[i][j]) + ' '
pixel_str += '\n'
with open('gray_img.txt', 'w') as f:#将txt文件存起来
f.write(pixel_str)
对一幅灰度图像实现运动模糊。
主函数
clear
%读图像
load gray_img.txt; %读取图像数据文件
[m,n]=size(gray_img); %获取输入的灰度图像尺寸大小。
winsize=input('Blur operator window size (an odd number, default = 9): '); %选择图像模糊运算窗口大小
if isempty(winsize), winsize=9;%若未输入运算窗口大小,则将运算窗口大小设置为9
elseif rem(winsize,2)==0,
winsize=winsize+1;
disp(['Use odd number for window size = ' int2str(winsize)])
end
disp(['1. Linear motion blur;'])
chos=input('Enter a number to choose type of blur applied (default = 1): ');
if isempty(chos), chos=1; end
if chos==1,
dirangle=input('Bluring direction (an angle in degrees, default = 45) = '); %选择运动模糊角度
if isempty(dirangle)
dirangle=45;
end
h=motionblur(dirangle,winsize); %调用运动模糊函数生成模糊模型
end
% 根据模糊模型生成模糊图像。
F=fft2(gray_img);% 执行二维傅里叶变换,将输入图像转换为频域表示。
Hmat=fft2(h,400,600); %执行二维傅里叶变换,将模糊模型 h 转换为频域表示,这里的 (400, 600) 是输出的大小。
Gmat=F.*Hmat; %对频域图像和模糊模型进行逐元素相乘,这是模糊图像的频域表示。
g=ifft2(Gmat); %对得到的频域图像执行逆傅里叶变换,以获得模糊图像的空域表示。
%绘制图形
figure(1),
subplot(121),imagesc(gray_img),colormap('gray'),title('original image') %显示原图像
subplot(122),imagesc(abs(g)),colormap('gray'),title('blurred image') %显示运动模糊图像
figure(2),
subplot(212),imagesc(log(1+abs(Gmat))),colormap('gray'),title('blurring filter') %显示时域模糊图像
subplot(211),imagesc(h),colormap('gray'),title('blurring filter mask') %显示运动模糊图像频谱
运动模糊函数 motion.m
function h=motionblur(dirangle,winsize)
if nargin<2
winsize=9; %默认窗口大小
end
h=zeros(winsize); %FIR 窗口,创建一个大小为 winsize x winsize 的零矩阵 h 作为 FIR(有限脉冲响应)窗口。
ext=(winsize-1)/2;
% 根据设定参数生成模糊图像,根据指定的模糊方向 dirangle 生成模糊核 h。模糊核描述了在图像上应用的运动模糊效果。
if (abs(abs(dirangle)-90) >=45) && (abs(abs(dirangle)-270)>=45),
%如果 dirangle 与水平方向(0度或180度)或垂直方向(90度或270度)之一的差的绝对值大于等于45度,就会选择水平方向的运动模糊。
slope=tan(dirangle*pi/180);
rloc=round(slope*[-ext:ext]);
for i=1:winsize,
h(ext-rloc(i)+1,i)=1;
end
else
slope=cot(dirangle*pi/180);
%如果选择了水平方向的运动模糊,将计算运动方向的斜率 slope,然后根据斜率 slope 计算模糊核中的位置,并将这些位置上的像素设置为1,以表示模糊效果。
cloc=round(slope*[-ext:ext]);
%如果选择了垂直方向的运动模糊,将计算运动方向的斜率的倒数 slope(cot 函数),然后根据斜率 slope 计算模糊核中的位置,并将这些位置上的像素设置为1,以表示模糊效果。
for i=1:winsize,
h(i,ext-cloc(i)+1)=1;
end
end
运行结果
采用顺序统计滤波器对图像进行滤波
自然图像中往往含有大量噪声,这些噪声可能服从一定的统计规律,因此可以采用顺序统计方法,对这些噪声加以剔除。
对一幅灰度图像添加噪声并滤波。
close all;
%1. 生成含噪图像
img = rgb2gray(imread('1.jpg'));
figure; imshow(img);
img =double(imnoise(img,'salt & pepper',0.1));
figure,imshow(img,[]);
%2. 采用均值滤波
N=5; %滤波模板大小
h=fspecial('average',N);
I=filter2(h,img);
figure,imshow(I,[])
%3. 中值滤波
I=medfilt2(img,[N N]);
figure,imshow(I,[])
%4. 最大值滤波
I=ordfilt2(img,N*N,true(N));
figure,imshow(I,[])
%5.最小值滤波
I=ordfilt2(img,1,true(N));
figure,imshow(I,[])
实验结果如下
采用中值滤波器,可以在消除噪声的同时,较好地保存图像边缘;采用最大值滤波器,
会生成许多白色区域;采用最小值滤波器,会生成许多黑色区域。
对已知噪声频率的含噪图像进行频域陷波滤波
原图像有用成分一般位于低频部分,可对图像添加纹理噪声,形成噪声图像;分析纹理的频率,设计陷波滤波器滤除噪声。
对沿 x 轴方向的波纹加性噪声进行陷波滤波。
生成波纹噪声图像
img = double(rgb2gray(imread('1.jpg')));
figure; imshow(img,[]);
sizec=size(img);
w=0.4*2*pi; %噪声的数字频率
N=2*pi/w; %噪声每一周期的采样点数
img_noise=img+20*ones(sizec(1),1)*sin(w*[1:sizec(2)]);
figure,imshow(img_noise,[]);
% 图像频谱
F0=fft2(img);
F0=fftshift(F0);
figure,imshow(log(abs(F0)),[]);
F=fft2(img_noise);
F=fftshift(F);
figure,imshow(log(abs(F)),[]);
%2.设计理想陷波滤波器
H=ones(sizec(1),sizec(2));
% 图像中心点
x0=sizec(1)/2+1;
y0=sizec(2)/2+1;
% 噪声所处频率点(x,y)
x=x0;
y=y0-round(sizec(2)/N);
H(x,y-3:y+3)=0;
H(x,(y0-y)+y0-3:(y0-y)+y0+3)=0;
%3. 滤波结果
I=ifftshift(F.*H);
img1=ifft2(I);
figure; imshow(img1,[]);
实验结果如下: