python图像退化实验

文章讲述了如何使用Python处理图像,包括从灰度图像到运动模糊的转换,以及使用不同滤波方法(如均值、中值、最大值和最小值)去除噪声。还涉及了针对特定频率噪声的陷波滤波技术。
摘要由CSDN通过智能技术生成

根据运动模型生成运动模糊图像

由于目标或摄像头运动,会使成像变得模糊,这种运动可以采用模型的方式加以描述,从而采用仿真的方法对清晰图像加以运动模糊,形成模糊图像,并可用于其后的运动模糊图像恢复。

先使用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,[]);

实验结果如下:

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值