求维纳滤波图像复原的C++或者OpenCV的程序代码!可运行的话,分数不是问题。真心求教!

求维纳滤波图像复原的C++或者OpenCV的程序代码!可运行的话,分数不是问题。真心求教!,第1张

CLC;全部清除;

%读取原始图像

格式长

模糊= imread('fig525(B)BMP');

插曲(1,2,1) ; imshow(模糊)标题(原始图像);

%自我功能维纳滤波

K = 00025;

[M,N] =尺寸(模糊);

频谱= 0(M,N);

H =零(M,N);

为u = 1:M

为V = 1:

H(U,V)= exp(-K ((UM / 2)^ 2 +(VN / 2)^ 2)^(5/6));

光谱(U, V)= H(U,V)^ 2;

结束

结束

F =双(模糊);

F1 = fftshift(FFT2(F))

HW = H /(频谱+0001);

restore1 = HW。 F1

恢复=实际(ifft2(ifftshift(restore1)));

插曲(1,2,2),imshow(恢复[]);标题(“自功能的维纳滤波');

%调用matlab的维纳%

数字过滤器功能;

HW1 =实际(ifft2(ifftshift(H)));转化空域起来

RESULT1 = deconvwnr(模糊HW1,0001);

结果2 = ifftshift(RESULT1);%

插曲(1逆转交换,1,3象限,四象限,2,1); imshow(结果2,[]);标题(“呼叫维纳滤波功能');

图像读取:

global I

% dialog for opening files

[imagefile , pathname]= uigetfile('tif');

if imagefile ~= 0

filename=[pathname imagefile];

[X,map]=imread(filename);

I=X;

show_Callback(hObject, eventdata, handles)

set(handlessave,'enable','on')

end;

图像保存:

global I

[imagefile , pathname, filterindex]= uiputfile({'tif','tif';'','All Files'},'Image Save As');

if (imagefile ~= 0 & filterindex==1)

filename=[pathname imagefile 'tif'];

imwrite(I,filename);

else (imagefile ~= 0)

filename=[pathname imagefile];

imwrite(I,filename);

end;

频域增强:

global I

J=imnoise(I,'salt & pepper',002);

%gei tuxiang tianjia yanjiao zaosheng

subplot(121),imshow(J)

title('han you zaosheng de yuan tuxiang')

J=double(J);

f=fft2(J);

g=fftshift(f);

[M,N]=size(f);

n=3;d0=20;

n1=floor(M/2);n2=floor(N/2);

for i=1:M

for j=1:N

d=sqrt((i-n1)^2+(j-n2)^2);

h=1/(1+0414(d/d0)^(2n));

g(i,j)=hg(i,j);

end

end

g=ifftshift(g);

g=uint8(real(ifft2(g)));

subplot(122),imshow(g)

title('san jie Butterworth lvbo tuxiang')

我和你说说吧,先说基本函数:

fft2是求傅里叶变换;

fftshift是把变换后的图像转置,让非零值转到中心,好观察。

real就是求实部;

imag就是求虚部;

你知道经过傅里叶变换原来的空间域转到频域上了吧?

频域的概念是有实部有虚部的是吧,那你怎么能在平面上表示出来呢?

就用到了复数里的几个概念:

一个是虚部实部的平方和均值(sqrt( RRfdp1^2+IIfdp1^2);)

在一个就是夹角问题(b=angle(fftI);)

这个知识高数都有,我就不用说了吧?

至于a=(a-min(min(a)))/(max(max(a))-min(min(a)))225;

我觉得就是一个圆滑函数,比如235536我想让它变成240

就是乘以圆滑系数,再乘以225。

max(max(a))是求矩阵a里的最大的那个像素值。

希望你掌握好的学习方法,分析程序如果看不懂的话可以一行行的运行,通过workspace找到分步运行的结果,具体分析。

最后感慨一句:百度知道不是赚钱的地方,分多分少不是衡量知识的标准。我助人为乐我快乐,积分又不能换钱,要那么多干嘛。

I=imread('lenabmp');

I=rgb2gray(I);

fftI=fft2(I);%二维离散傅立叶变换

sfftI=fftshift(fftI);%直流分量移到频谱中心

RR=real(sfftI);%取傅立叶变换的实部

II=imag(sfftI); %取傅立叶变换的虚部

A=sqrt(RR^2+II^2); %计算频谱幅值

B=(A-min(min(A)))/(max(max(A))-min(min(A)))225; %归一化

pha=angle(fftI);

figure(1)%设定窗口

subplot(1,4,1),imshow(I);title('原图');

subplot(1,4,2),imshow(B);title('原图像的频谱'); %显示原图像的频谱

subplot(1,4,3),imshow(log(B),[]);title('原图像的频谱'); %显示原图像的频谱

subplot(1,4,4),imshow(pha);title('相位谱')

figure(2)

x=abs(ifft2(fftI));

magif=ifft2(abs(fftI));

phaif=ifft2(exp(1ipha));

subplot(1,3,1),imshow(phaif,[]);title('相位谱重建图像');

subplot(1,3,2),imshow(x,[]);title('频谱重建原图像')

subplot(1,3,3),imshow(magif,[]);title('幅度谱重建图像')

以上就是关于求维纳滤波图像复原的C++或者OpenCV的程序代码!可运行的话,分数不是问题。真心求教!全部的内容,包括:求维纳滤波图像复原的C++或者OpenCV的程序代码!可运行的话,分数不是问题。真心求教!、急求几个MATLAB程序、Matlab数字图像处理,要求详细解释代码,每个函数都要解释.这个是对图像求幅值谱和相位谱,并对其进行重构.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10106802.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存