matlab图像边缘检测 背景变全黑
blood=imread('A.jpg');[x,y,z]=size(blood);%求出图象大小b=double(blood);N=sqrt(100)*randn(x,...
blood = imread('A.jpg');
[x,y,z]=size(blood); % 求出图象大小
b=double(blood);
N =sqrt(100) * randn(x,y,z); % 生成方差为10的白噪声
I=b+N; % 噪声干扰图象
for i=1:x % 实际图象的灰度为0~255
for j=1:y
if (I(i,j)>255)
I(i,j)=255;
end
if (I(i,j)<0)
I(i,j)=0;
end
end
end
z0=max(max(I)); % 求出图象中最大的灰度
z1=min(min(I)); % 最小的灰度
T=(z0+z1)/2;
TT=0;
S0=0; n0=0;
S1=0; n1=0;
allow=0.5; % 新旧阈值的允许接近程度
d=abs(T-TT);
count=0; % 记录几次循环
while(d>=allow) % 迭代最佳阈值分割算法
count=count+1;
for i=1:x
for j=1:y
if (I(i,j)>=T)
S0=S0+I(i,j);
n0=n0+1;
end
if (I(i,j)<T)
S1=S1+I(i,j);
n1=n1+1;
end
end
end
T0=S0/n0;
T1=S1/n1;
TT=(T0+T1)/2;
d=abs(T-TT);
T=TT;
end
Seg=zeros(x,y);
for i=1:x
for j=1:y
if(I(i,j)>=T)
Seg(i,j)=1; % 阈值分割的图象
end
end
end
SI=1-Seg; % 阈值分割后的图象求反,便于用腐蚀算法求边缘
se1=strel('square',3); % 定义腐蚀算法的结构
SI1=imerode(SI,se1); % 腐蚀算法
BW=SI-SI1; % 边缘检测
%=====传统的边缘检测方法======%
I=uint8(I);
BW1=edge(SI,'sobel', 0.11);
BW2=edge(SI,'log', 0.015);
%===========图象显示==========%
figure(1);
imshow(I);title('Original') % 显示阈值分割的图象
figure(2);
imshow(BW2);title('Soble') % 显示新算法的边缘图象
figure(3)
imshow(BW1);title('Gauss-Laplace')
figure(4)
imshow(BW);title('New algorithm')
我想要的结果是立方体的边缘线都存在,但现在只有外缘 ,没有内部的三条,哪位大神有方法 跪谢
可能是我思路错了,其实只要把背景的白色反光点去掉就好,保留白色方块全貌,背景全黑,有没大神知道matlab怎么写? 重谢 展开
[x,y,z]=size(blood); % 求出图象大小
b=double(blood);
N =sqrt(100) * randn(x,y,z); % 生成方差为10的白噪声
I=b+N; % 噪声干扰图象
for i=1:x % 实际图象的灰度为0~255
for j=1:y
if (I(i,j)>255)
I(i,j)=255;
end
if (I(i,j)<0)
I(i,j)=0;
end
end
end
z0=max(max(I)); % 求出图象中最大的灰度
z1=min(min(I)); % 最小的灰度
T=(z0+z1)/2;
TT=0;
S0=0; n0=0;
S1=0; n1=0;
allow=0.5; % 新旧阈值的允许接近程度
d=abs(T-TT);
count=0; % 记录几次循环
while(d>=allow) % 迭代最佳阈值分割算法
count=count+1;
for i=1:x
for j=1:y
if (I(i,j)>=T)
S0=S0+I(i,j);
n0=n0+1;
end
if (I(i,j)<T)
S1=S1+I(i,j);
n1=n1+1;
end
end
end
T0=S0/n0;
T1=S1/n1;
TT=(T0+T1)/2;
d=abs(T-TT);
T=TT;
end
Seg=zeros(x,y);
for i=1:x
for j=1:y
if(I(i,j)>=T)
Seg(i,j)=1; % 阈值分割的图象
end
end
end
SI=1-Seg; % 阈值分割后的图象求反,便于用腐蚀算法求边缘
se1=strel('square',3); % 定义腐蚀算法的结构
SI1=imerode(SI,se1); % 腐蚀算法
BW=SI-SI1; % 边缘检测
%=====传统的边缘检测方法======%
I=uint8(I);
BW1=edge(SI,'sobel', 0.11);
BW2=edge(SI,'log', 0.015);
%===========图象显示==========%
figure(1);
imshow(I);title('Original') % 显示阈值分割的图象
figure(2);
imshow(BW2);title('Soble') % 显示新算法的边缘图象
figure(3)
imshow(BW1);title('Gauss-Laplace')
figure(4)
imshow(BW);title('New algorithm')
我想要的结果是立方体的边缘线都存在,但现在只有外缘 ,没有内部的三条,哪位大神有方法 跪谢
可能是我思路错了,其实只要把背景的白色反光点去掉就好,保留白色方块全貌,背景全黑,有没大神知道matlab怎么写? 重谢 展开
展开全部
图像可否发上来?
你这段是不是从别人的程序粘贴过来的
那程序是使用不同办法求图像边缘,然后比较结果的
而按你的描述你需要的结果,只是想把背景变黑
好像不需要几种求边缘的办法
而且如果只是要背景变黑
那么分出前景背景就可以,不需要提取边缘
你这段是不是从别人的程序粘贴过来的
那程序是使用不同办法求图像边缘,然后比较结果的
而按你的描述你需要的结果,只是想把背景变黑
好像不需要几种求边缘的办法
而且如果只是要背景变黑
那么分出前景背景就可以,不需要提取边缘
追答
I = imread('文件名'); %读取图像
G=rgb2gray(I); %将rgb转为灰度图
G=double(G)/255; %转为0~1之间表示的灰度图
[x y]=size(G); %求图像大小
T=(max(G(:))+min(G(:)))/2; %取最大值和最小值中值作为初始阈值
TT=0;
allow=0.2; %允许T和TT的误差
d=abs(T-TT);
count=0; % 记录几次循环
while(d>=allow) % 迭代最佳阈值分割算法
count=count+1;
BW=(G>=T); %以T为阈值分割
S0=sum(G(BW)); %计算大于阈值的点数据和
n0=sum(sum(BW)); %计算大于阈值的点数
S1=sum(G(~BW)); %计算小于阈值的点数据和
n1=x*y-n0; %计算小于阈值的点数
T0=S0/n0;
T1=S1/n1;
TT=(T0+T1)/2; %计算得到TT
d=abs(T-TT); %新的距离
T=TT; %新的阈值
end
BW=(G>=T); %最佳阈值分割的二值图像BW
se=strel('square',7);
BW2=imclose(BW,se); %图像闭算法填充图像中
BW2=uint8(BW2);
Iout=zeros(size(I),'uint8'); %为输出图像分配空间
Iout(:,:,1)=I(:,:,1).*BW2; %rgb三个通道都根据BW2计算
Iout(:,:,2)=I(:,:,2).*BW2; %BW2为1的地方保留数据
Iout(:,:,3)=I(:,:,3).*BW2; %BW2为0的地方变为0,就是全黑
subplot(121),imshow(I);title('原图');
subplot(122),imshow(Iout);title('背景全黑图');
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询