- 奇石珠宝真君
-
cameraman.tif 是黑白图片,你自己的图是彩色的,两者数据结构不同,要转成黑白图像
相关推荐
imfilter函数的介绍
imfilter函数叫做实现线性空间滤波函数。功能:对任意类型数组或多维图像进行滤波。2023-07-10 20:43:281
matlab 中imfilter与和conv2具体在运算上是什么区别?imfilter的相关运算是什么意思?
imfilter实现的是线性空间滤波; conv2是计算两个矩阵的二维卷积1、MATLAB中提供了卷积运算的函数命令conv2,其语法格式为: C = conv2(A,B) C = conv2(A,B)返回矩阵A和B的二维卷积C。若A为ma×na的矩阵,B为mb×nb的矩阵,则C的大小为(ma+mb+1)×(na+nb+1)。 2、MATLAB图像处理工具箱提供了基于卷积的图象滤波函数filter2,filter2的语法格式为: Y = filter2(h,X) 其中Y = filter2(h,X)返回图像X经算子h滤波后的结果,默认返回图像Y与输入图像X大小相同。例如: 其实filter2和conv2是等价的。MATLAB在计算filter2时先将卷积核旋转180度,再调用conv2函数进行计算。 Fspecial函数用于创建预定义的滤波算子,其语法格式为: h = fspecial(type) h = fspecial(type,parameters) 参数type制定算子类型,parameters指定相应的参数,具体格式为: type="average",为均值滤波,参数为n,代表模版尺寸,用向量表示,默认值为[3,3]。 type= "gaussian",为高斯低通滤波器,参数有两个,n表示模版尺寸,默认值为[3,3],sigma表示滤波器的标准差,单位为像素,默认值为0.52023-07-10 20:43:401
matlab filter2和imfilter有什么区别
imfilter 可进行多维图像(RGB等)进行空间滤波,且可选参数较多filter2 只能对二维图像(灰度图)进行空间滤波两个函数结果类型不一样,只需要在I1=filter2(h,I)后面加上I1=uint8(I1)进行类型转换,结果就是一样的。2023-07-10 20:43:491
电脑imfiiter.dll什么意思
系统文件imfilter_mex.dll是存放在Windows系统文件夹中的重要文件,通常情况下是在安装操作系统过程中自动创建的,对于系统正常运行来说至关重要。在正常情况下不建议用户对该类文件(imfilter_mex.dll)进行随意的修改。它的存在对维护计算机系统的稳定具有重要作用。如果用户电脑被木马病毒、或是流氓软件篡改导致出现imfilter_mex.dll丢失、imfilter_mex.dll确实损坏等弹窗现象,可以用第三方软件修复,可在网上查找,下载后替换原文件。2023-07-10 20:43:563
matlab图像处理 滤波方式
h=fspecial("gaussian",[9 9]),"replicate")中replicate指的是创建高斯滤波器,replicate 图像大小通过复制外边界的值来扩展(说白了都一样的,无明显区别功能:对任意类型数组或多维图像进行滤波。用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,...) 或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:选项描述filtering_mode‘corr"通过使用相关来完成,该值为默认。‘conv"通过使用卷积来完成boundary_options‘X"输入图像的边界通过用值X(无引号)来填充扩展其默认值为0‘replicate"图像大小通过复制外边界的值来扩展‘symmetric"图像大小通过镜像反射其边界来扩展‘circular"图像大小通过将图像看成是一个二维周期函数的一个周期来扩展size_options‘full"输出图像的大小与被扩展图像的大小相同‘same"输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。2023-07-10 20:44:051
对图象进行求反的matlab程序
好多人回答啊!图像求反两种方法都可以>> g1=imgdjust(f,[0 1],[1 0]); %f为输入图像,此为第一种方法>> g2=imcomplement(f); %f同样为输入图像,此为第二种方法至于邻域均值嘛,主要用 fspecial和imfilter 两个函数,具体可以看一下帮助 ^_^下面的两个例子分别用正方形和圆形的模板进行邻域均值。>> w1=fspecial("average"); %产生一个3x3大小的方形平均滤波模板w1>> g1=imfilter(f,w1,"replicate"); % g1为处理后的图像。"replicate"指卷积填充边缘时用复制边界的值来扩展。 >> w2=fspecial("disk"); %产生一个半径为5的圆形平均滤波模板w2>> g2=imfilter(f,w2,"replicate"); % 同样,g2为处理后的图像,"replicate"指卷积填充边缘时用复制边界的值来扩展。2023-07-10 20:44:344
这段代码的错误是什么?我是matlab初学者,英文也不太好,看不大懂,希望有人能快点解答,比较着急
lz 你好,是因为这句imshow(wr);,wr为逻辑型数据,imshow不支持,支持uint8,需要转换,修改如下:f=imread("lena(hui).png");subplot(2,2,1)imshow(f);title("(a)原始图像");f=double(f);hv=fspecial("prewitt");hh=hv.";gv=abs(imfilter(f,hv,"replicate"));gh=abs(imfilter(f,hh,"replicate"));g=sqrt(gv.^2+gh.^2);subplot(2,2,2);L=watershed(g);wr=L==0;ww=uint8(wr);%必须把逻辑变量转换为uint8型,imshow才能读取imshow(ww);%title("(b)分水岭");figureL1=uint8(L);%imshow(L1);%2023-07-10 20:44:412
怎样用MATLAB实现中值和均值滤波
中值滤波楼上答了,5*5的均值滤波代码 w2=fspecial("average",[5 5]); %% 先定义一个滤波器 h=imfilter(a,w2,"replicate"); %%让图像通过滤波器 imshow(h); imwrite(h,"8.jpg"); 均值滤波是I=medfilt2(a,[3 3],"symmetric")可以在matlab中查询medfilt函数的用法,本例是使用3*3的滤波器采用镜像边界法做均值滤波。2023-07-10 20:45:022
有一个关于matlab的问题。希望大神帮忙解决。
可这样:h= fspecial("sobel"); h1 = h"; g1= imfilter(im, h,"symmetric","same"); g2 = imfilter(im, h1,"symmetric","same"); m=sqrt(double(g1).^2 + double(g2).^2);2023-07-10 20:45:101
matlab 怎么仿真添加离焦模糊,不同的参数。具体步骤是什么?谢谢各位行家
img=double(img);r=3;%散焦半径rdefocus3=fspecial("disk",r); r=6;%散焦半径rdefocus6=fspecial("disk",r); defocusimg3 = uint8(imfilter(img,defocus3,"conv","circular"));defocusimg6 = uint8(imfilter(img,defocus6,"conv","circular"));2023-07-10 20:45:332
我想对图像的某个区域(前面已经检测出的)进行低通滤波,matlab如何实现?imfilter 会对整个图片滤波。
有个最笨的方法,也是最容易想到的,就是把图像的其余部分和检测出的部分做差分离,然后单独对分离出的那个区域进行滤波,然后将滤波结果再和剩下的图像的其余部分做和整合起来。。。。。。2023-07-10 20:45:422
在matlab上,怎么给这个图片加高斯噪声呢,加入的是均值为0、方差0.008的高斯噪声。 实在不会呀。。
clcclear allclose allA = imread("cameraman.tif"); % 读入图像imshow(A);title("原图");V=0.008;Noisy=imnoise(A,‘gaussian",0,V);figure1;imshow(Noisy);%添加均值为0、方差0.008的高斯噪声y_mask = [-1 -1 -1;0 0 0;1 1 1]; % 建立Y方向的模板x_mask = y_mask"; % 建立X方向的模板I = im2double(A); % 将图像数据转化为双精度dx = imfilter(I, x_mask); % 计算X方向的梯度分量dy = imfilter(I, y_mask); % 计算Y方向的梯度分量grad = sqrt(dx.*dx + dy.*dy); % 计算梯度grad = mat2gray(grad); % 将梯度矩阵转换为灰度图像level = graythresh(grad); % 计算灰度阈值BW = im2bw(grad,level); % 用阈值分割梯度图像figure, imshow(BW); % 显示分割后的图像即边缘图像title("Prewitt")就是这样了。2023-07-10 20:46:002
这个程序为何总是运行错误。如下:
出现类似情况多是由于系统感染病毒、存在恶意插件、IE组件损害造成的,按照下文所述的方法尝试解决“出现了运行时间错误”的问题,希望对您有所帮助! 出现了运行时间错误的解决办法: 降低IE安全级别,启用ActiveX 控件,关闭脚本调试; 第一步:首先打开IE浏览器,点击上方的“工具”菜单——>选择“Internet选项”——>在常规选项中点击“删除Cookies”——>点击“确定”——>再点击“删除文件”——>勾选“删除所有脱机内容”,点击确定——>不要关闭Internet选项窗口; 第二步:切换到“安全”选项卡中——>点击右下角的“默认级别”——>下拉滑动条,将“安全级别-中”调整为“安全级别-低”——>仍然不要关闭Internet选项窗口; 第三步:切换到“高级”选项卡中——>下拉右边的滑动条,找到“禁用脚本调试(Internet Explorer)”和“禁用脚本调试(其他)”,将这两个项目前面都打上勾——>最后点击“确定”退出Internet选项; 修复IE浏览器必要的组件; 第一步:点击“开始”菜单——>选择“运行”——>在运行中输入“regsvr32 actxprxy.dll”(不含引号),点击确定——>系统提示“actxprxy.dll中的DLLRegisterServer成功”——>点击确定; 第二步:仍然打开“运行”——>在运行中输入“regsvr32 shdocvw.dll”(不含引号),点击确定——>提示“shdocvw.dll中的DLLRegisterServer成功”——>点击确定; 最后,假如上述方法都无法解决“出现了运行时间错误”的问题,可能感染了木马病毒或IE恶意插件,请下载安装杀毒软件或3 60安 全 卫 士,先清除恶意插件,再执行全盘扫描;如果仍然不能解决出现了运行时间错误,请尝试重装 IE浏 览 器。2023-07-10 20:46:071
MATLAB中用于图像恢复的几个函数的作用及效果,麻烦解释下
PSF=fspecial("motion",40,75)%%%运动模糊算子,有两个参数,表示摄像物体逆时针方向以%%%%%%theta角度运动了len个像素,len的默认值为9,theta的默认值为MF=imfilter(I,PSF,"circular"); %%%图像空域滤波noise=imnoise(zeros(size(I)),"gaussian",0,0.001);%%生成各种噪声图像MFN=imadd(MF,im2uint8(noise));%%运动模糊图像"NSR=sum(noise(:).^2)/sum(MFN(:).^2);imshow(deconvwnr(MFN,PSF,NSR),[])%逆滤波复原"[reg1 LAGRA]=deconvreg(MFN,PSF,NP/3.0);%使用约束最小二乘方滤波复原图像2023-07-10 20:46:141
matlab高斯滤波自定义函数怎么做
matlab中有自带的高斯滤波函数h=fspecial("gaussian",hsize,sigma),其中hsize是滤波器尺寸,sigma是标准差。若要自己实现的话:functionh=gau_fil(hsize,sigma)siz=(hsize-1)/2;[x,y]=meshgrid(-siz(2):siz(2),-siz(1):siz(1));arg=-(x.*x+y.*y)/(2*sigma*sigma);h=exp(arg);h(h<eps*max(h(:)))=0;sumh=sum(h(:));ifsumh~=0,h=h/sumh;end;end调用时在commandwindow输入:(例如大小为3*3,标准差1)gau_fil([33],1)得到结果:ans=0.07510.12380.07510.12380.20420.12380.07510.12380.0751望采纳,谢谢!2023-07-10 20:46:214
matlab请指教,关于求图像梯度
你必须将gradmap转换成图像数据,好像是mat2img(gradmap),具体的函数我记不大清楚了,你查查帮助。2023-07-10 20:46:411
matlab 图像处理出现问题,一幅轮胎图像的缺陷提取 K2(i,j)=K2(i,j)*C;时出现问题,请大家帮忙看看,非常
K3=sum(K2);%%这里,K2为矩阵,楼主的意思应该是求矩阵元素的和吧,那么sum(K2)只是按列求和,如果K2是m*n的矩阵,那么K3=sum(K2)后的大小为1*n,改成K3=sum(sum(K2))即可,下面的代码不用改,即可运行。2023-07-10 20:46:541
关于图像边缘检测,使用MATLAB程序, 基于Di Zenzo几何测度的彩色图像边缘检测的M函数
f就是你导入的rgb图片。首先按照上面的代码建立一个.m文件,将文件存盘,命名为 colorgrad.m然后在matlab命令窗口输入如下命令:>>f=imread("test.jpg") %这里的test.jpg是图片文件名>> [VG,A,PPT]=colorgrad(f,0)>>figure; imshow(PPT);2023-07-10 20:47:001
Matlab边缘检测后,求边缘围出的面积及边缘的周长
matlab有很多函数都做好了,拿来用就行了,不是要站在巨人肩膀上吗。。。regionpropsbwperimbwarea没事多翻翻 数字图像处理 Matlab版 的附录,里面把常用的都列出来了,多看看,能节省你很多时间2023-07-10 20:47:102
MATLAB 程序错误;
由报错信息可知,是deconvblind函数的调用出了问题。在我的Matlab中显示的是第五个参数格式错误,也就是WEIGHT。这好像是控制参数,如果不是很需要,就把它去掉,就可以无出错地运行。改为:[J2 P2] = deconvblind(Blurred,P1,50,[]);2023-07-10 20:47:192
本人毕业设计做的是基于Retinex算法研究,急需SSR,MSR,Mccann的Matlab仿真代码。要能运行的。
太多了太多了 只贴一个把%Retinex的MSR实现图像增强的代码,可运行,f=imread("c.jpg");fr=f(:, :, 1); fg=f(:, :, 2); fb=f(:, :, 3);%RGB通道mr=mat2gray(im2double(fr)); mg=mat2gray(im2double(fg)); mb=mat2gray(im2double(fb));%数据类型归一化alf1=1458; %定义标准差alf=a^2/2 a=54n=161;%定义模板大小n1=floor((n+1)/2);%计算中心for i=1:n for j=1:n b(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf1))/(pi*alf1); %高斯函数 endendnr1 = imfilter(mr,b,"conv", "replicate");ng1 = imfilter(mg,b,"conv", "replicate");nb1 = imfilter(mb,b,"conv", "replicate");%卷积滤波ur1=log(nr1); ug1=log(ng1); ub1=log(nb1);tr1=log(mr);tg1=log(mg);tb1=log(mb);yr1=(tr1-ur1)/3;yg1=(tg1-ug1)/3;yb1=(tb1-ub1)/3;alf2=53.38; %定义标准差alf=a^2/2 a=10.3325x=31;%定义模板大小x1=floor((n+1)/2);%计算中心for i=1:n for j=1:n a(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf2))/(6*pi*alf2); %高斯函数 endendnr2 = imfilter(mr,a,"conv", "replicate");ng2 = imfilter(mg,a,"conv", "replicate");nb2 = imfilter(mb,a,"conv", "replicate");%卷积滤波ur2=log(nr2); ug2=log(ng2); ub2=log(nb2);tr2=log(mr);tg2=log(mg);tb2=log(mb);yr2=(tr2-ur2)/3;yg2=(tg2-ug2)/3;yb2=(tb2-ub2)/3;alf3=13944.5; %定义标准差alf=a^2/2 a=167l=501;%定义模板大小l1=floor((n+1)/2);%计算中心for i=1:n for j=1:n e(i,j) =exp(-((i-n1)^2+(j-n1)^2)/(4*alf3))/(4*pi*alf3); %高斯函数 endendnr3 = imfilter(mr,e,"conv", "replicate");ng3 = imfilter(mg,e,"conv", "replicate");nb3 = imfilter(mb,e,"conv", "replicate");%卷积滤波ur3=log(nr3); ug3=log(ng3); ub3=log(nb3);tr3=log(mr);tg3=log(mg);tb3=log(mb);yr3=(tr3-ur3)/3;yg3=(tg3-ug3)/3;yb3=(tb3-ub3)/3;dr=yr1+yr2+yr3;dg=yg1+yg2+yg3;db=yb1+yb2+yb3;cr=im2uint8(dr); cg=im2uint8(dg); cb=im2uint8(db);z=cat(3, cr, cg, cb); figure, imshow(z)2023-07-10 20:47:282
怎么在MATLAB中计数二值图像中目标物八邻域值为某一值的个数
是这样abs(imfilter(pUnImage,[-1 0 0;0 1 0;0 0 0]))abs(imfilter(pUnImage,[0 -1 0;0 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 -1;0 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 0;-1 1 0;0 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 -1;0 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;-1 0 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;0 -1 0])).abs(imfilter(pUnImage,[0 0 0;0 1 0;0 0 -1])).2023-07-10 20:47:372
matlab图像锐化
%%%目测你的是拉普拉斯算子 下面的程序也是一样的 你试试 图片改成你的图片A=imread("lena.bmp"); figure(1);subplot(1,2,1);imshow(A);title("原图");I=double(A);h=[-1 -1 -1;-1 9 -1;-1 -1 -1];J=conv2(I,h,"same");K=uint8(J);subplot(1,2,2);imshow(K);title("使用拉普拉斯算子锐化处理后的图");2023-07-10 20:47:511
matlab 常用的图像消噪函数有哪些
第一步去椒盐噪声,第二部去高斯噪声,可以使用imfilter函数。 用中值滤波去除椒盐噪声,维纳滤波去除高斯噪声。 代码网上特别多,请自行搜索,我觉得这样对你更有好处。2023-07-10 20:47:571
matlab拉普拉斯滤波器程序
function projectdemo(n,m,p)if mod(n,floor(n))~=0 | n<=2 | mod(n,2)==0 error("n必须是大于等于3的奇数整数");endif mod(m,floor(m))~=0 | m<=2 | mod(m,2)==0 error("m必须是大于等于3的奇数整数");endif mod(p,floor(p))~=0 | p<=2 | mod(p,2)==0 error("p必须是大于等于3的奇数整数");endcenter1=-((n^2)-1);lapmask1=ones(n);lapmask1((n+1)/2,(n+1)/2)=center1; center2=-((m^2)-1);lapmask2=ones(m);lapmask2((m+1)/2,(m+1)/2)=center2; center3=-((p^2)-1);lapmask3=ones(p);lapmask3((p+1)/2,(p+1)/2)=center3;fin=im2double(imread("moon.tif"));gout1=fin-imfilter(fin,lapmask1,"replicate");gout2=fin-imfilter(fin,lapmask2,"replicate");gout3=fin-imfilter(fin,lapmask3,"replicate"); S0=char("*");S1=num2str(n);S2=char("滤波图像");S=strcat(S1,S0,S1,S2); subplot(2,2,1);imshow(fin);axis ontitle("原始图像","FontSize",14,"FontName","隶书","color","b");subplot(2,2,2);imshow(gout1);axis ontitle("3*3滤波","FontSize",14,"FontName","隶书","color","b");subplot(2,2,3);imshow(gout2);axis ontitle("5*5滤波","FontSize",14,"FontName","隶书","color","b");subplot(2,2,4);imshow(gout3);axis ontitle("7*7滤波","FontSize",14,"FontName","隶书","color","b");2023-07-10 20:48:151
matlab数字图象处理
模板越大,图像越模糊h5=ones(5,5)/25;h7=ones(7,7)/49j=imfilter(I,h5)2023-07-10 20:48:221
在matlab中fspecial是什么意思
创建一个二维的滤波器。图像处理中,创建好后可以使用函数imfilter调用这个滤波器,对某个图像做滤波操作,如高斯模糊。2023-07-10 20:48:291
帮帮我 我不知道分水岭算法在图像分割中的应用…… 代码,还有别的帮帮我
clear,clc%三种方法进行分水岭分割%读入图像filename="sar1.bmp";f=imread(filename);Info=imfinfo(filename);if Info.BitDepth>8 f=rgb2gray(f);endfigure,mesh(double(f));%显示图像,类似集水盆地%方法1:一般分水岭分割,从结果可以看出存在过分割问题b=im2bw(f,graythresh(f));%二值化,注意应保证集水盆地的值较低(为0),否则就要对b取反d=bwdist(b); %求零值到最近非零值的距离,即集水盆地到分水岭的距离 l=watershed(-d); %matlab自带分水岭算法,l中的零值即为风水岭w=l==0; %取出边缘g=b&~w; %用w作为mask从二值图像中取值figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(b);subplot(2,3,3),imshow(d);subplot(2,3,4),imshow(l);subplot(2,3,5),imshow(w);subplot(2,3,6),imshow(g);%方法2:使用梯度的两次分水岭分割,从结果可以看出还存在过分割问题(在方法1的基础上改进)h=fspecial("sobel");%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,"replicate").^2+imfilter(fd,h","replicate").^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0; g2=imclose(imopen(g,ones(3,3)),ones(3,3));%进行开闭运算对图像进行平滑l2=watershed(g2);%再次进行分水岭运算wr2=l2==0;f2=f;f2(wr2)=255;figuresubplot(2,3,1),imshow(f);subplot(2,3,2),imshow(g);subplot(2,3,3),imshow(l);subplot(2,3,4),imshow(g2);subplot(2,3,5),imshow(l2);subplot(2,3,6),imshow(f2);%方法3:使用梯度加掩模的三次分水岭算法(在方法2的基础上改进)h=fspecial("sobel");%获得纵方向的sobel算子fd=double(f);g=sqrt(imfilter(fd,h,"replicate").^2+imfilter(fd,h","replicate").^2);%使用sobel算子进行梯度运算l=watershed(g);%分水岭运算wr=l==0; rm=imregionalmin(g); %计算图像的区域最小值定位,该函数仅仅是用来观察为何分水岭算法产生这么多集水盆地im=imextendedmin(f,2);%上面仅是产生最小值点,而该函数则是得到最小值附近的区域,此处的附近是相差2的区域fim=f; fim(im)=175; %将im在原图上标识出,用以观察 lim=watershed(bwdist(im));%再次分水岭计算em=lim==0;g2=imimposemin(g,im|em);%在梯度图上标出im和em,im是集水盆地的中心,em是分水岭l2=watershed(g2); %第三次分水岭计算f2=f;f2(l2==0)=255; %从原图对分水岭进行观察figuresubplot(3,3,1),imshow(f);subplot(3,3,2),imshow(g);subplot(3,3,3),imshow(l);subplot(3,3,4),imshow(im);subplot(3,3,5),imshow(fim);subplot(3,3,6),imshow(lim);subplot(3,3,7),imshow(g2);subplot(3,3,8),imshow(l2)subplot(3,3,9),imshow(f2);2023-07-10 20:48:361
(1) 选择一幅图像,叠加零均值高斯噪声,然后分别利用领域平均法和中值滤波法对该图像进行滤波,显示滤
领域法:y=imread("D:ABC.jpg");J1=imnoise(y,"salt & pepper",0.02);J2=imnoise(y,"gaussian");H1=ones(3,3)/9;Y=imfilter(y,H1);Y1=imfilter(J1,H1);Y2=imfilter(J2,H1);subplot(2,2,1),imshow(Y);subplot(2,2,2),imshow(Y1);subplot(2,2,3),imshow(Y2);中值法y=imread("D:ABC.jpg");J1=imnoise(y,"salt & pepper",0.02);J2=imnoise(y,"gaussian",0.02);subplot(2,2,1),imshow(J1);subplot(2,2,2),imshow(J2);y1=medfilt2(J1,[5,5]);y2=medfilt2(J2,[5,5]);subplot(2,2,3),imshow(y1);subplot(2,2,4),imshow(y2);2023-07-10 20:48:452
谁知道ENVI里面图像增强中(Enhance)高斯增强是什么原理,文档或者链接都行啊
高斯滤波(高斯平滑)是图像处理,计算机视觉里面最常见的操作。平时,我们都是用matlab或者opencv的函数调用:imfilter或者cvSmooth,并不关心底层的实现。然而当开发者要实做高斯滤波的时候,往往就会很迷惘,往往会被以下几个问题困扰:给定sigma,即标准偏差,怎么确定离散化后滤波器的窗口大小?给定窗口大小,怎么计算高斯核的sigma,即标准方差?怎么实现可分离滤波器?我在google上搜了一下,还真没几个人把实现的细节讲清楚了。这里,我尝试结合三份源码,做个小小的总结。三份源码分别是:opencv中的cvfilter.cppautopano-sift-c中的GaussianConvolution.cGIMP中的blur-gauss.c和unsharp-mask.c在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。这里我们只讨论第一种方法。二维高斯函数的形式是这样的:f(x,y) = A e^{- left(frac{(x-x_o)^2}{2sigma_x^2} + frac{(y-y_o)^2}{2sigma_y^2} ight)}.有着如下的形状,形状很激凸,怎么会叫高斯平滑呢,分明是高斯激凸嘛:基本上,离散化的主旨就是保留高斯函数中心能量最集中的中间部分,忽略四周能量很小的平坦区域。这只是个很感性的描述,具体实现起来,就会出现千奇百怪的版本。下面结合三份源码,看看现实世界里的高斯平滑到底长的什么样子。首先是第一个问题:给定sigma,怎么计算窗口大小?直接上opencv的源码,在cvFilter函数中:param1 = cvRound(sigma1*(depth == CV_8U ? 3 : 4)*2 + 1)|1;opencv认为半径为3*sigma的窗口就是高斯函数能量最集中的区域。(为什么在图像深度不是8U的时候,使用4*sigma半径的窗口就不得而知了,有高人指点一下?)autopan0-sift-c是图像拼接软件hugin里面的sift实现,在实现DoG的时候需要做不同尺度的高斯平滑,实现如下,在GaussianConvolution_new1函数中:dim = 1 + 2 * ((int) (3.0 * sigma));可见autopano也是实现的3*sigma半径的窗口。在GIMP里,实现比较奇特,在blur_gauss.c的make_rle_curve函数里面,const gdouble sigma2 = 2 * sigma * sigma;const gdouble l = sqrt (-sigma2 * log (1.0 / 255.0));int n = ceil (l) * 2;if ((n % 2) == 0)n += 1;我是没看懂那个 log (1.0 / 255.0)是干嘛的。。。惭愧。效果来看,这个实现的窗口半径是约等于2.2*sigma。然后是第二个问题:给定窗口大小,怎么计算sigma?opencv的实现,在cvFilter.cpp的init_gaussian_kernel函数中:sigmaX = sigma > 0 ? sigma : (n/2 – 1)*0.3 + 0.8;再次不可解。。。乘以0.3还可以接受,加上0.8是为嘛啊?autopano没有实现这个特性。GIMP的实现:/* we want to generate a matrix that goes out a certain radius* from the center, so we have to go out ceil(rad-0.5) pixels,* inlcuding the center pixel. Of course, that"s only in one direction,* so we have to go the same amount in the other direction, but not count* the center pixel again. So we double the previous result and subtract* one.* The radius parameter that is passed to this function is used as* the standard deviation, and the radius of effect is the* standard deviation * 2. It"s a little confusing.*/radius = fabs (radius) + 1.0;std_dev = radius;radius = std_dev * 2;/* go out ‘radius" in each direction */matrix_length = 2 * ceil (radius – 0.5) + 1;注释讲的很清楚了,基本上就是认为sigma应该等于窗口半径的一半。看完这三分源码,结论就是,关于sigma和半径,你爱怎么算就怎么算吧,差不多就行。。。(额。。费了半天劲,就得到这么一句废话啊)。第三个问题是可分离滤波器:由于高斯函数可以写成可分离的形式,因此可以采用可分离滤波器实现来加速。所谓的可分离滤波器,就是可以把多维的卷积化成多个一维卷积。具体到二维的高斯滤波,就是指先对行做一维卷积,再对列做一维卷积。这样就可以将计算复杂度从O(M*M*N*N)降到O(2*M*M*N),M,N分别是图像和滤波器的窗口大小。问题是实现时候怎么计算一维的卷积核呢?其实很简单,按照前面计算出来的窗口大小,计算所有离散点上一维高斯函数的权值,最后别忘了将权值之和归一化到1.有码有真相,来自opencv:for( i = 0; i <= n/2; i++ ){double t = fixed_kernel ? (double)fixed_kernel[i] : exp(scale2X*i*i);if( type == CV_32FC1 ){cf[(n/2+i)*step] = (float)t;sum += cf[(n/2+i)*step]*2;}else{cd[(n/2+i)*step] = t;sum += cd[(n/2+i)*step]*2;}}sum = 1./sum;for( i = 0; i <= n/2; i++ ){if( type == CV_32FC1 )cf[(n/2+i)*step] = cf[(n/2-i)*step] = (float)(cf[(n/2+i)*step]*sum);elsecd[(n/2+i)*step] = cd[(n/2-i)*step] = cd[(n/2+i)*step]*sum;}2023-07-10 20:48:542
setcharacterencodingfilter.java 怎么用
在web.xml里面配置吧?<filter> <filter-name>imFilter</filter-name> <filter-class>com.sinovatech.filter.ImFilter</filter-class></filter><filter-mapping> <filter-name>imFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>过滤器一般都这么 配置不过你这个可能要加个initparam 传编码值的2023-07-10 20:49:031
imfilter函数的介绍
imfilter函数叫做实现线性空间滤波函数。功能:对任意类型数组或多维图像进行滤波。2023-07-10 20:49:411
请教关于matlab中imfilter函数的使用
请教关于matlab中imfilter函数的使用功能:对任意类型数组或多维图像进行滤波。用法:B = imfilter(A,H)B = imfilter(A,H,option1,option2,...)或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)2023-07-10 20:49:491
matlab filter2和imfilter有什么区别啊
两个函数结果类型不一样,只需要在I1=filter2(h,I)后面加上I1=uint8(I1)进行类型转换,结果就是一样的。2023-07-10 20:49:552
SRCNN的卷积运算的代码,有没有大神懂,
基于卷积神经网络... 博文 来自: wangxujin666的博客 1.SRCNN(原理和代码)基于TensorFlow的代码下载:https://github.com/tegg82023-07-10 20:50:041
matlab调用自写函数问题
MATLAB 调用自己写的函数要function 而且要函数名与.m文件名相同 然后再命令窗口用函数名调用2023-07-10 20:50:111
MATLAB软件处理图像复原的问题?
f=checkerboard(8);%读图像PSF=fspecial("gaussian",7,10);%高斯核SD=0.01;%噪声标准差g=imnoise(imfilter(f,PSF),"gaussian",0,SD^2);%图像中加入模糊核噪声subplot(3,2,1);%三子图第一张imshow(f),title("(a)");%画原图subplot(3,2,2);%三子图第二张imshow(g),title("(b)");%画降质图像DAMPAR=10*SD;%去模糊参数LIM=ceil(size(PSF,1)/2);%坐标缩影WEIGHT=zeros(size(g));%去模糊权重初始化WEIGHT(LIM+1:end-LIM,LIM+1:end-LIM)=1;%去模糊权重赋值NUMIT=5;%迭代次数f5=deconvlucy(g,PSF,NUMIT,DAMPAR,WEIGHT);%去模糊subplot(3,2,3);%三子图第三张imshow(f5),title("(c)");%画复原图像2023-07-10 20:50:171
谁有spfilt和intrans函数的M文件
function f = spfilt(g, type, m, n, parameter) % % f = spfilt(g, "amean", m, n) 算术平均 % f = spfilt(g, "gmean", m, n) 几何平均 % f = spfilt(g, "hmean", m, n) 谐函数平均 % f = spfilt(g, "chmean", m, n,Q) contraharmonic 平均 % f = spfilt(g, "median", m, n) 中值 % f = spfilt(g, "max", m, n) 最大值 % f = spfilt(g, "min", m, n) 最小值 % f = spfilt(g, "midpoint", m, n) 中点 % f = spfilt(g, "atrimmed", m, n,D) alpha-trimmed 平均 % if nargin == 2 m = 3; n = 3; Q = 1.5; d = 2; elseif nargin == 5 Q = parameter; d = parameter; elseif nargin == 4 Q = 1.5; d = 2; else error("Wrong number of inputs."); end switch type case "amean" w = fspecial("average",[m,n]); f = imfilter(g,w,"replicate"); case "gmean" f = gmean(g,m,n); case "hmean" f = harmean(g,m,n); case "chmean" f = charmean(g,m,n,Q); case "median" f = medfilt2(g, [m,n], "symmetric"); case "max" f = ordfilt2(g,m*n,ones(m,n),"symmetric"); case "min" f = ordfilt2(g,1,ones(m,n),"symmetric"); case "midpoint" f1 = ordfilt2(g,1,ones(m,n),"symmetric"); f2 = ordfilt2(g,m*n,ones(m,n),"symmetric"); f = imlincomb(0.5,f1,0.5,f2); case "atrimmed" if (d<0) | (d/2~=round(d/2)) error("d must be a nonnegative, even integer.") end f = alphatrim(g,m,n,d); otherwise error("Unknown filter type.") end2023-07-10 20:50:241
matlab运行中出现如下问题,这是什么原因?好像是函数有问题
help fspecial FSPECIAL Create predefined 2-D filters. H = FSPECIAL(TYPE) creates a two-dimensional filter H of the specified type. Possible values for TYPE are: "average" averaging filter "disk" circular averaging filter "gaussian" Gaussian lowpass filter "laplacian" filter approximating the 2-D Laplacian operator "log" Laplacian of Gaussian filter "motion" motion filter "prewitt" Prewitt horizontal edge-emphasizing filter "sobel" Sobel horizontal edge-emphasizing filter "unsharp" unsharp contrast enhancement filter Depending on TYPE, FSPECIAL may take additional parameters which you can supply. These parameters all have default values. H = FSPECIAL("average",HSIZE) returns an averaging filter H of size HSIZE. HSIZE can be a vector specifying the number of rows and columns in H or a scalar, in which case H is a square matrix. The default HSIZE is [3 3]. H = FSPECIAL("disk",RADIUS) returns a circular averaging filter (pillbox) within the square matrix of side 2*RADIUS+1. The default RADIUS is 5.img_smoothed=imfilter(img_noise,fspecial("averge,5"));这句错了 改成img_smoothed=imfilter(img_noise,fspecial("averge",5)); 试一下2023-07-10 20:50:332
求超分辨率图像重建的MATLAB代码或者软件
function Output = denoiseByTv(Ima, Thr) ImaTv = imfilter(Ima, "Laplacian");ImaTh = (ImaTv< Thr)*ImaTv;output = Ima - ImaTh;end2023-07-10 20:50:401
matlab高斯滤波 运行不了了。。。求高手
filter2改成imfilter2023-07-10 20:50:581
如何计算两幅灰度图像之间的误差
可以啊,这是matlab的一个例程,读取的图片就是灰度图像,运行没问题ref = imread("pout.tif");H = fspecial("Gaussian",[11 11],1.5);A = imfilter(ref,H,"replicate");subplot(1,2,1); imshow(ref); title("Reference Image");subplot(1,2,2); imshow(A); title("Blurred Image");[ssimval, ssimmap] = ssim(A,ref);fprintf("The ssim value is %0.4f. ",ssimval);figure, imshow(ssimmap,[]);title(sprintf("ssim Index Map - Mean ssim Value is %0.4f",ssimval));2023-07-10 20:52:321
matlab图像处理问题
I=imread("psb.jpg");PSF=fspecial("gaussian",7,10); %产生一个高斯低通滤波器V=.01; %高斯加性噪声的标准差IF1=imfilter(I,PSF);BlurredNoisy=imnoise(IF1,... "gaussian",0,V); %原图像通过高斯低通滤波器后,加入高斯噪声 NoisePower=V*numel(I); %计算噪声的功率[J, LAGRA]=deconvreg(BlurredNoisy,PSF,NoisePower); %subplot(221);imshow(BlurredNoisy);title("A=Blurred and Noisy");我运行没有问题,你检查一下图片的路径对不对。然后看反馈的错误信息。或者在其他的电脑上试试。2023-07-10 20:52:412
求梯度分布直方图matlab代码
function H=HOG(Im)nwin_x=3;%set here the number of HOG windows per bound boxnwin_y=3;B=9;%set here the number of histogram bins[L,C]=size(Im); % L num of lines ; C num of columnsH=zeros(nwin_x*nwin_y*B,1); % column vector with zerosm=sqrt(L/2);if C==1 % if num of columns==1 Im=im_recover(Im,m,2*m);%verify the size of image, e.g. 25x50 L=2*m; C=m;endIm=double(Im);step_x=floor(C/(nwin_x+1));step_y=floor(L/(nwin_y+1));cont=0;hx = [-1,0,1]; %水平梯度模板hy = -hx";%垂直梯度模板grad_xr = imfilter(double(Im),hx);%水平梯度grad_yu = imfilter(double(Im),hy);%垂直梯度angles=atan2(grad_yu,grad_xr);%梯度角度magnit=((grad_yu.^2)+(grad_xr.^2)).^.5;%梯度大小for n=0:nwin_y-1 for m=0:nwin_x-1 cont=cont+1; angles2=angles(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x); magnit2=magnit(n*step_y+1:(n+2)*step_y,m*step_x+1:(m+2)*step_x); v_angles=angles2(:); v_magnit=magnit2(:); K=max(size(v_angles)); %assembling the histogram with 9 bins (range of 20 degrees per bin) bin=0; H2=zeros(B,1); for ang_lim=-pi+2*pi/B:2*pi/B:pi bin=bin+1; for k=1:K if v_angles(k)<ang_lim v_angles(k)=100; H2(bin)=H2(bin)+v_magnit(k); end end end H2=H2/(norm(H2)+0.01); H((cont-1)*B+1:cont*B,1)=H2; endend2023-07-10 20:52:471
matlab中deconvwnr函数是什么
函数是用PSF即点分布函数来修复图形的。 MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。2023-07-10 20:52:574
matlab filter2()函数怎么用
解决办法如下所示:y = filter(b,a,X),[y,zf] = filter(b,a,X),[y,zf] = filter(b,a,X,zi),y = filter(b,a,X,zi,dim),[...] = filter(b,a,X,[],dim)。扩展资料:一、Filter新增加的功能包括:1、新的国际化。2、应用程序生命周期事件控制。3、澄清了类的装载规则。4、新的错误及安全属性。5、不赞成使用HttpUtils 类。6、各种有用的方法。二、一个filter必须实现javax.servlet.Filter的三个方法:1. void setFilterConfig(FilterConfig config) //设置filter 的配置对象。2. FilterConfig getFilterConfig() //返回filter的配置对象。3. void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) //执行filter 的工作。参考资料来源:百度百科-Filter2023-07-10 20:53:054
MATLAB 语句解释 tmpx=Ix(i:i+step-1,j:j+step-1);
你这个是对的,第i个元素是不是该列的最大值,如果是,会返回1,不是的话,返回0.其实你不用这么做,你可以直接用find函数。找到最大的元素的位置。i = find(tmp(:,j) == max(tmp(:.j))), i就是这一列里面最大数的编号。2023-07-10 20:53:381
MATLAB GUI 设计数字图像处理软件包括以下内容: 1,图像的读入 2 图像格式的转换包括jpg,bmp,gif等
近期正在做这个,给楼主一半代码,另一半不怎么懂图像读入[filename,pathname]=uigetfile({"*.jpg";"*.bmp";"*.tif";"*.*"},"载入图像");if isequal(filename,0)|isequal(pathname,0) errordlg("没有选中文件","出错"); return;else file=[pathname,filename]; x=imread(file); set(handles.axes1,"HandleVisibility","ON"); axes(handles.axes1); imshow(x); set(handles.axes1,"HandleVisibility","OFF"); axes(handles.axes2); imshow(x); handles.img=x; guidata(hObject,handles);end图像增强(不知道楼主要几个增强)直方图均衡化global Taxes(handles.axes2);T=getimage;h=histeq(handles.img); imshow(h);handles.img=h;guidata(hObject,handles); 频域滤波axes(handles.axes2);y1=handles.img; f=double(y1); % 数据类型转换,matlab不支持图像的无符号整型的计算g=fft2(f); % 傅里叶变换g=fftshift(g); % 转换数据矩阵[M,N]=size(g);nn=2; %二阶巴特沃斯低通滤波器d0=50; %截止频率50m=fix(M/2); n=fix(N/2);for i=1:M for j=1:N d=sqrt((i-m)^2+(j-n)^2); h=1/(1+0.414*(d/d0)^(2*nn)); % 计算低通滤波器传递函数 result(i,j)=h*g(i,j); endendresult=ifftshift(result);y2=ifft2(result);y3=uint8(real(y2));imshow(y3); % 显示处理后的图像锐化可以使用拉普拉斯算子进行锐化,具体可以使用fspecial函数与imfilter函数灰度化 global Taxes(handles.axes2);T=getimage;x=rgb2gray(handles.img); imshow(x);handles.img=x;guidata(hObject,handles);楼主先给几分呗,还有几份资料关于gui的一起发你邮箱2023-07-10 20:53:472
MATLAB 局部图像处理
很简单的, 因为你的图中的圆不是标准的规范的圆, 用圆的方程之类的方法话边框反而不好, 直接遍历图像中所有像素, 如果相邻像素的像素值相差超过了一定的阈值(自己试一下, 我感觉至少有50以上), 就把这个点标记成红色. 以后处理的时候判断一下当前经过的红色点的个数, 偶数个肯定是圆框外的部分, 奇数个就在圆框内的部分. 比如说我现在遍历到了图像的第二行, 一开始我没有遇到红色点, 红色像素点个数累积为0. 这时就不用做图像处理, 等到遇到了第一个红色像素, 这时我们就进入了图中第一个圆的区域中, 然后开始做处理, 下次遇到红色点就表示离开了圆形区域. 后面的同样道理2023-07-10 20:53:573
MATLAB中怎么产生任意奇数尺寸拉普拉斯滤波器,写一个M文件函数
以一幅uint8类灰度图像为例,原图:直接使用laplacian滤波模板滤波:>> f=imread("moon.tif");>> w=fspecial("laplacian",0)>> g1=imfilter(f,w,"replicate");>> imshow(g1)效果并不理想,因为原图是一幅uint8类图像,输出结果仍为uint8类,所有像素均为正值,而拉普拉斯滤波模板中存在负值,变换结果中的所有负值被截掉了。解决此问题,须先进行类型变换:f2=im2double(f); %将f转换为归一化的double类图像然后再进行滤波:>> g2=imfilter(f2,w,"replicate");>> imshow(g2,[])2023-07-10 20:54:231