如何模糊图像

517意见(过去30天)
豪尔赫·奥尔蒂斯
豪尔赫·奥尔蒂斯 2019年3月16日
编辑: 乔希雅西希2021年6月13日
写一个名为 模糊 这会模糊输入图像。函数的调用方式如下:
输出=模糊(IMG,W);
在哪里 IMG. ,输入图像是0和255之间的灰度像素值的二维矩阵。通过平均每个像素附近的像素值来执行模糊。具体地,输出像素值是大小的方形子矩阵中的像素的平均值 2 w + 1 给定像素位于中心位置。例如,如果 w 是1,然后我们使用3x3矩阵,即,我们平均给定像素和本身的所有相邻像素。当模糊矩阵的部分落在图像外时,仅使用有效像素。例如,对应的模糊值 w = 1 at index(1,1)将是元素(1,1),(1,2),(2,1)和(2,2)的均值 IMG. 和输出 输出 的类型 uint8.
你可以下载 在这里测试图像 在MATLAB中使用。
23评论
萨纳哈菲兹
萨纳哈菲兹 2021年6月5日
非常感谢

登录评论。

答案(13)

Dipesh Poudel.
Dipesh Poudel. 2020年4月9日
功能[输出] =模糊(A,W)
[row col] = size(A);
a = uint8(a);
B =南(大小(A) + (2 * w));
B (w + 1: end-w w + 1: end-w) =一个;
输出= 0 * a;
i = w + 1:行+ w
j = w + 1:坳+ w
tmp = B(我:我+ w, j-w: j + w);
输出(我,j-w) =意味着(tmp (~ isnan (tmp)));
结束
结束
输出= UINT8(输出);
6个评论
图像分析师
图像分析师 于2021年2月11日
您的myblur()函数需要RGB映像需要调用IMSPLIT()并调用您的模糊(),涉及单色图像:
功能blurredRGBImage = MyBlur(rgbImage, windowWidth)
%分成单独的颜色通道。
[Redchannel,GreenChannel,Bluechannel] = Imsplit(RGBimage);
%单独模糊每个颜色通道。
blurredR = blur(redChannel, windowWidth);
bluredg = blur(greenChannel, windowWidth);
blurredB = blur(blueChannel, windowWidth);
%重组成单个RGB图像。
blurredRGBImage = cat(3, blurredR, blurredG, blurredB);
然后调用它:
rgbimage = imread('peppers.png');
blurredRGBImage = uint8(MyBlur(rgbImage, 9));
imshow (blurredRGBImage)

登录评论。


Yaksha SJ
Yaksha SJ 2020年5月10日
功能w =模糊(img)
%转换为double进行计算
imgD =双(img);
[row, col] = size(img);
Out = Zeros(行,Col);
2 = 1:行
jj = 1:坳
%获取子替代品的索引
r1 = ii-w;
R2 = II + W;
C1 = JJ-W;
C2 = JJ + W;
测试索引是否有效
%如果没有,设置为有效的最小/最大
如果R1 <1
r1 = 1;
结束
如果r2>行
r2 =行;
结束
如果c1 < 1
C1 = 1;
结束
如果c2 >坳
c2 = col;
结束
获得子矩阵并将平均值赋给输出像素
stickline (c = 0, c = 0, c, c), colorred;
(二世,jj) =意味着(m (:));
结束
结束
%转换回uint8
= uint8(出);
结束
2的评论
8月阿加瓦尔
8月阿加瓦尔 2020年5月14日
嘿,如果我在代码的最后一段生产此更改,我会得到错误:
原代码:
获得子矩阵并将平均值赋给输出像素
stickline (c = 0, c = 0, c, c), colorred;
(二世,jj) =意味着(m (:));
结束
结束
%转换回uint8
= uint8(出);
结束
修改代码:
获得子矩阵并将平均值赋给输出像素
stickline (c = 0, c = 0, c, c), colorred;
OUT(II,JJ)= UINT8(平均值(m(:)));%uint8转换在这里自身百分比
结束
结束
结束
这个错误说 变量输出必须是数据类型UINT8。它目前是双倍的。
我是matlab的新手。我无法理解转换时的错误,我在更改的代码中的方式。请帮忙

登录评论。


KSSV
KSSV 2019年3月16日
编辑:KSSV 2019年3月16日
我= imread('peppers.png') ;
我= 1:3
I(::,i)= uint8(conv2(i(:,:,i),一个(20)/ 20 ^ 2,“相同”));
结束
imshow(i);
4评论
图像分析师
图像分析师 2020年6月23日
什么代码?豪尔赫或KSSV的吗?或者在页面上出现代码的其他众多地方之一?

登录评论。


图像分析师
图像分析师 2019年3月16日
你的函数可以调用内置函数conv2()或imfilter()吗?
如果不是,看,并适应,我附加的手动卷积程序。
2的评论
图像分析师
图像分析师 2019年3月22日
好吧,你选择的解决方案不是很强大,但它将工作 一些 案件,并非所有情况。

登录评论。


Jaimin Motavar.
Jaimin Motavar. 2019年7月4日
有人能帮我找出这个代码中有什么问题吗?
功能输出=模糊(IMG,W)
B =双(IMG);
[m,n] =尺寸(b);
w + k = 2 * 1;
我= 1:m
j = 1: n
p =我给(k / 2);
q = i +修复(k / 2);
r = j-fix (k / 2);
s = j +修复(k / 2);
如果P <1
p = 1;
结束
如果q > m
q = m;
结束
如果R <1
r = 1;
结束
如果S> N.
s = n;
结束
a = b([p:q],[r:s]);
B (i, j) =意味着((:));
结束
结束
输出= uint8 (B);
结束
5个评论
沃尔特·罗伯森
沃尔特·罗伯森 2019年7月23日
您正在覆盖B中的输入数据,因此您的计算,所以您的计算基于上面的已经平滑的像素,而不是上方的原始像素上方和左侧。

登录评论。


Brandon McLaughlin.
Brandon McLaughlin. 2019年7月22日
帮助!我几乎完成了这门课程,但由于某种原因,我无法让这个功能工作。我有我的代码,但它一直在说我做错了。我究竟做错了什么?
功能输出=模糊(IMG,W)
img =双(img);
d = w * 2 + 1
s =大小(img)
输出= []
r = 1:D:S(1)
行= [];
C = 1:D:S(2)
如果R +w<=s(1) && c+w<=s(2) && R -w>=1 && c-w>=1
tot = sum(sum(img((r-w):( r + w),(c-w):( c + w))))​​));
val =合计/ (d * d);
nxt = =(d,d);
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.C + W <= S(2)&& r-w> = 1 && c-w> = 1
合计=总和(总和(img ((r w):最终,(北京市):(c + w))));
val = tot /(d *(s(1)-r + w));
nxt = ((s (1) - r + w), d);
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.R +w<=s(1) && R -w>=1 && c-w>=1
合计=总和(总和(img ((r w): (r + w),(北京市):结束)));
val = tot /(d *(s(2)-c + w));
nxt = 1 (d (s (2) - c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.r + w <= s(1)&& c + w <= s(2)&& r-w> = 1
tot = sum(sum(img((r-w):( r + w),1:(c + w))))​​)));
val =合计/ (d * (c + w));
nxt = 1 (d (c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.r + w <= s(1)&& c + w <= s(2)&& c-w> = 1
合计=总和(总和(img (1: (r + w),(北京市):(c + w))));
val =合计/ (d * (r + w));
nxt的= ((r + w), d);
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.r + w <= s(1)&& c + w <= s(2)
合计=总和(总和(img (1: (r + w), 1: (c + w))));
val =合计/ ((r + w) * (c + w));
NXT =((c + w),(r + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.r w > = 1 & &北京市> = 1
合计=总和(总和(img ((r w):最终,(北京市):结束)));
val = tot /((s(1)-r + w)*(s(2)-c + w));
nxt = =((s(1)-r + w),(s(2)-c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.r + w < = s(1) & &北京市> = 1
tot = sum(sum(img(1:(r + w),(c-w):结束))));
val = tot /((r + w)*(s(2)-c + w));
nxt = ((r + w), (s (2) - c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.c + w < = s (2) & & r w > = 1
合计=总和(总和(img ((r w):最终,1:(c + w))));
val = tot /((s(1)-r + w)*(c + w));
nxt = ((s (1) - r + w), (c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
结束
结束
输出=(输出;行);
结束
行= []
S2 =大小(输出)
如果S2(1)
C = 1:D:S(2)
如果C + w <= s(2)&& c-w> = 1
tot = sum(sum(s2(1)+1):s(1),(c-w):( c + w))))​​));
Val = Tot /((s(1)-s2(1))* d);
nxt = =((s(1)-s2(1)),d);
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.c + w < = s (2)
tot = sum(sum(s2(1)+1):s(1),1:(c + w))))​​)));
val =合计/ ((s (1) s2 (1)) * (c + w));
nxt = ((s (1) s2 (1)), (c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
eleesif.北京市> = 1
合计=总和(总和(img ((s2(1) + 1):(1),(北京市):结束)));
Val = Tot /((s(1)-s2(1))*(S2(2)-C + W));
nxt = =((s(1)-s2(1)),(s2(2)-c + w));
NXT(1:结束,1:结束)= val;
行= [行nxt];
结束
结束
输出=(输出;行);
结束
行= []
col = []
s3 =大小(输出)
如果S3(2)
r = 1:D:S(1)
如果r + w < = s (1) & & r w > = 1
tot = sum(sum((r-w):( r + w),(s3(2)+1):s(2)))));
val = tot /(d *(s(2)-s3(2))));
nxt =(d,(s(2)-s3(2)))));
NXT(1:结束,1:结束)= val;
col = [col; nxt];
eleesif.r + w <= s(1)
合计=总和(总和(img (1: (r + w), (s3 (2) + 1): s (2))));
val = tot /((r + w)*(s(2)-s3(2))));
nxt = ((r + w), (s (2) s3 (2)));
NXT(1:结束,1:结束)= val;
col = [col; nxt];
eleesif.r w > = 1
tot = sum(sum((r-w):( r + w),(s3(2)+1):s(2)))));
val = tot /((s3(1)-r + w)*(s(2)-s3(2))));
nxt = ((s3 (1) - r + w) (s (2) s3 (2)));
NXT(1:结束,1:结束)= val;
col = [col; nxt];
结束
结束
s4 =大小(col)
如果S4(1)
tot = sum(sum(s2(1)+1):s(1),(s3(2)+1):s(2)))));
val = tot /((s(1)-s2(1))*(s(2)-s3(2)));
nxt = = =((s(1)-s2(1)),(s(2)-s3(2))));
NXT(1:结束,1:结束)= val;
col = [col; nxt];
结束
输出= [输出COL];
结束
输出= UINT8(输出);
3评论
图像分析师
图像分析师 2019年8月1日
很高兴你弄清楚了。

登录评论。


图像分析师
图像分析师 2019年7月23日
查看我的手动卷积例程,附加。

shreyansh pitroda
shreyansh pitroda 2020年4月29日
%%可以找到此代码中的错误
功能[输出]=模糊(img, w)
img = uint8 (img);
[A,B] =大小(IMG);
输出= 0 (a, b);
h = 2 * w + 1;
我= 1:a
J = 1:B-H
value = img(i:(h + i-1),j:(h + j-1));
输出(i,j)=均值(值(:));
结束
结束
= uint8输出(输出);
结束
6个评论
萨纳哈菲兹
萨纳哈菲兹 2021年6月5日
非常感谢! !

登录评论。


大卫·冈萨雷斯
功能输出=模糊(IMG,W)
镜像= -1* size(img) + 2*w;
镜子(W + 1:终端W,W + 1:end-W)= IMG;
输出= 0(大小(img));
II = W + 1:尺寸(镜子,1)-W
JJ = W + 1:尺寸(镜像,2)-W
submatrix =镜像(II-W:II + W,JJ-W:JJ + W);
sum_values =总和(子矩阵(余子式> = 0));
有效=总和(子矩阵(:)> = 0);
输出(ii-w jj-w) = sum_values /有效;
结束
结束
= uint8输出(输出);

迪夫Ratna
迪夫Ratna 20月25日
我被自己想到了......
我知道它太长了..
功能Out =模糊(img, w)
temp = img;
s =大小(img);
如果S(1)> W && S(2)> W
% 1
我= 1:w
j = 1:w
temp(i,j)= sum(sum(img(1:i + w,1:j + w))')/((i + w)*(j + w));
结束
结束
% 2
我= 1:w
J = w+1: s(2)-w
临时(i, j) =(金额总和(img(1:我+ w, j-w: j + w))”)/ ((i + w) * (w + w + 1);
结束
结束
% 3
我= 1:w
J = s(2)-w+1: s(2)
临时(i, j) =总和(总和(img(1:我+ w, j-w: s (2 )))') / (( 我+ w) * (s (2) - j + 1 + w));
结束
结束
% 4
i = w + 1:s(1)-w
j = 1:w
Temp(i,j)= sum(sum(img(i-w:i + w,1:j + w))')/((w + w + 1)*(j + w));
结束
结束
%5
i = w + 1:s(1)-w
J = w+1: s(2)-w
temp(i,j)= sum(sum(img(i-w:i + w,j-w:j + w))')/((w + w + 1)*(w + w + 1));
结束
结束
% 6
i = w + 1:s(1)-w
J = s(2)-w+1: s(2)
临时(i, j) =总和(总和(img(我:我+ w, j-w: s (2 )))') / (( w + w + 1) * (s (2) - j + 1 + w));
结束
结束
% 7
I = s(1)-w+1: s(1)
j = 1:w
temp (i,j) = sum(sum(img(i-w:s(1) , 1:j+w))') / ((s(1)-i+1+w)*(j+w));
结束
结束
% 8
I = s(1)-w+1: s(1)
J = w+1: s(2)-w
temp (i,j) = sum(sum(img(i-w:s(1) , j-w:j+w))') / ((s(1)-i+1+w)*(w+w+1));
结束
结束
% 9
I = s(1)-w+1: s(1)
J = s(2)-w: s(2)
临时(i, j) =总和(总和(img(我:(1),j-w: s (2 )))') / (( (1) - i + 1 + w) * (s (2) - j + 1 + w));
结束
结束
结束
出=温度;
结束
1评论
Para Preethi.
Para Preethi. 2021年1月22日
这不起作用

登录评论。


Chandrashekhar Dhangar
Chandrashekhar Dhangar 于2020年7月16日
%可以帮助这个问题吗?
%ERROR =变量输出具有错误的值。
%用5x5 uint8矩阵测试,其中所有255-s都在第一行和最后行和列和零中,而w = 1
功能输出=模糊(IMG,W)
[m,n] =尺寸(IMG);
我=双(img);
S = 0 (2 * w + 1, 2 * w + 1);
出=零(m,n);
i = 1: m
j = 1: n
u = 1:2 * w + 1
v = 1:2 * w + 1
如果I-W> 0 && J-W> 0 && I-W + U-1 <= M && J-W + V-1 <= n
年代(u, v) = im(我+ u-1 j-w +它们);
其他的
s(U,V)= 0;
结束
结束
结束
出(i,j)= sum(s(:))/(2 * w + 1)^ 2;
结束
结束
输出= UINT8(OUT);
结束
9日评论
萨纳哈菲兹
萨纳哈菲兹 2021年6月2日

登录评论。


aniket GIRI
aniket GIRI 于2020年7月18日
Function out =模糊(img,w)
%转换为double进行计算
imgD =双(img);
[row, col] = size(img);
Out = Zeros(行,Col);
对于II = 1:行
对于JJ = 1:Col
%获取子替代品的索引
r1 = ii-w;
R2 = II + W;
C1 = JJ-W;
C2 = JJ + W;
%测试索引是否有效%如果不有效,设置为有效的min/max
如果1 < 1
r1 = 1;
结束
如果r2 >行
r2 =行;
结束
如果c1 <1
C1 = 1;
结束
如果c2> col
c2 = col;
结束
获得子矩阵并将平均值赋给输出像素
stickline (c = 0, c = 0, c, c), colorred;
(二世,jj) =意味着(m (:));
结束
结束
%转换回uint8
= uint8(出);
结束
4评论
图像分析师
图像分析师 2020年7月23日
如果第一行是1,那么第w行是0或负的。你不能从第一行开始,除非你检查窗口将关闭图像的情况下,在这种情况下,你必须截断窗口。请参阅我附加的手动卷积。

登录评论。


乔希雅西希
乔希雅西希 2021年6月13日
编辑:乔希雅西希 2021年6月13日
这就是我所做的,它的工作。请不要直接复制它,因为你只会伤害自己。希望在决定采取什么方法时有助于:
功能输出=模糊(IMG,W)
%保存img的尺寸
y =大小(img, 1);
x =尺寸(IMG,2);
%制作重复的IMG进行修改
imgdup = img;
%创建了所有-1的较大矩阵,与图像加上边框的大小相同
b = 1 (y + 2 * w,x + 2 * w) * -1;
%复制IMG在更大的矩阵内
BSQUARE((W + 1):END-W,W + 1:END-W)= IMG;
我= 1:y
j = 1: x
%为单个像素制作一个小矩阵加上其周围像素
Pixelraw = bsquare([i:2 * w + i],[j:2 * w + j]);
%在忽略-1时计算小矩阵中的平均值
Pixelavg = mean(pixelraw(pixelraw ~= -1));
%将平均值复制到重复图像中的单个像素
imgdup (i, j) = pixelavg;
结束
结束
%将重复图像转换为unint8并分配给输出
输出= UINT8(IMGDUP);

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!