matlab 图像变换--灰度调整、滤波增强---二值化(阈值分割)--形态学处理--特征提取

代码如下:(可以借鉴下,这些代码只对原图有效,换张图就完全不一样了)

clear,close all
imview close all
I = imread('c:\家乡.jpg');
bw1 = rgb2gray(I);
surf(double(bw1(1:8:end,1:8:end))),zlim([0 255]);title('背景色观察');
set(gca,'ydir','reverse');
se = strel('disk',25);
background = imopen(bw1,se);
bw2 = imsubtract(bw1,background);
se1=strel('disk',10)
bw3 = imtophat(bw2,se1);
bw4 = imadjust(bw3,stretchlim(bw3),[0 1]);
bw5 =medfilt2(bw4);
bw6 = imadjust(bw5,stretchlim(bw5),[0 1]);
bw7=im2bw(bw4,100/255);
%图像变换以及图像增强(灰度变换、滤波变换)
figure;
subplot(3,3,1),imshow(I),title('源图像');
subplot(3,3,2),imshow(bw1),title('灰度图像');
subplot(3,3,3),imshow(background),title('背景图像');
subplot(3,3,4),imshow(bw2),title('背景色消除后图像');
subplot(3,3,5),imshow(bw3),title('缨帽变换');
subplot(3,3,6),imshow(bw4),title('灰度变换1');
subplot(3,3,7),imshow(bw5),title('中值滤波');
subplot(3,3,8),imshow(bw6),title('灰度变换2');
subplot(3,3,9),imshow(bw7),title('灰度直方图二值化');
%图形学处理、特征提取
se2 = strel('disk',5);
e1 = imclose(bw7,se2);
se3 = strel('rectangle',[4 3]);
bw8 = imerode(e1,se3);
e2 = imopen(bw8,se2);
se4 = strel('rectangle',[3 4]);
bw9 = imerode(bw8,se4);
bw10 = imfill(bw9,'holes');
se5 = strel('diamond',10);
bw11 = imerode(bw10,se5);
se6 = strel('rectangle',[5 4]);
bw12 = imerode(bw11,se6);
se7 = strel('rectangle',[25 20]);
bw13 = imdilate(bw12,se7);
bw14 = bwperim(bw13);
bw15 = I;
bw15(bw14)= 255;
figure,
subplot(3,3,1),imshow(e1),title('闭运算');
subplot(3,3,2),imshow(bw8),title('腐蚀1');
subplot(3,3,3),imshow(e2),title('开运算');
subplot(3,3,4),imshow(bw9),title('腐蚀2');
subplot(3,3,5),imshow(bw10),title('填补空洞');
subplot(3,3,6),imshow(bw11),title('腐蚀3');
subplot(3,3,7),imshow(bw12),title('腐蚀4');
subplot(3,3,8),imshow(bw13),title('膨胀');
subplot(3,3,9),imshow(bw14),title('边缘提取');
figure,imshow(bw15);title('叠加合成');
imview(bw15);

 

 

灰度处理和图像增强

图像提取、形态学处理、图像分割

图像格式的转化

图像的输出


显示:
hist(I);

whos

imfinfo('')

imwrite(I,'XX.tif');

纹理映射方式观察
[x,y,z]= cylinder;warp(x,y,z,I);

指定输出图像像素的大小:J = imresize(I,1.25);【tif】

图像的旋转:J = imrotate(I,90,'bilinear');【tif】

图像的裁剪:J = imcrop(I,[60 40 100 90]);【tif】

区域属性度量 stats = regionprops(bwlabel(I),'all');stats(23)【png】【也不用imshow】

 

灰度调整:增强(只改变灰度和颜色,不消除物体,不改变图像的原有物质)
imshow(I,[]);
histeq(I)
adapthisteq(I)

imsubtract(I,50)(图像相减)

灰度调节imadjust(I,stretchlim(I),[]);{提高对比度}
imadjust(I,stretchlim(I),[0 1]);

直方图均衡自适应调整bw1 = imadjust(adapthisteq(I,'NumTiles',[10 10]));

图像的二值化level = graythresh(I),J = im2bw(I,level);
J = im2bw(I,graythresh(I));【自动灰度阈值分割】

自定义阈值分割figure,imhist(I);J=im2bw(I,100/255);【通过灰度来进行二值化】

二值图像的调节色彩imshow(bw,[1 0 0;0 1 0])

求反色imshow(~I)
求补色imshow(imcomplement(I));

通过乘法来改变亮度和对比度(乘以数值改变亮度,乘以本身图像改变对比度)
J= immultiply(I,0.2);
I16 = uint16(bw8);bw9 = immultiply(I16,I16);


直接灰度变换J = imadjust(I,[0 1],[1 0],1.5);[PNG]【灰度倒置线性变换】
灰度的非线性变换J = 45*log(double(I)+1);figure,imshow(J,[])

直方图灰度变换J = imadjust(I,[0.15 0.9],[0 1]);figure;imshow(J);figure,imhist(J,64)【区域映射】【增强减弱图像的对比度】
灰度范围的映射J = imadjust(I,[0 0.2],[0.5 1]);【此方法有利于消除背景区域,然后方便边界的提取】
索引图的灰度变换[X,map] = imread('forest.tif');I = ind2gray(X,map);J = imadjust(I,[],[],0.5);


改变图像以调节对比度
抖动 imshow(dither(I));

滤波和灰度调整是为了消除图像中的一些东西
目的相同,原理不同
J= filter2([1 2;-1 -2],I)
J = filter2([1 2 1;0 0 0;-1 -2 -1],I);
J = filter2(fspecial('sobel'),I);

I2 = imfilter(I,ones(5,5)/25);

中值滤波K = medfilt2(j);【把杂色过滤掉】


灰度调整与消除背景后的图像相加有异曲同工之妙,都能够进行亮更亮,暗更暗的效果。


处理方法,先进行背影的去除,然后进行(图像相加)增强(第一次增加对比度),然后进行第二次的效果增强。对比度调节,到了这个时候明暗已经很突出了,不过还有些微小的灰度变化,然进行一下彻底地图像二值化,进行完全的黑白分明,这样就能进行边缘提取,要是感觉还不行的话,那就进行形态学的膨胀或腐蚀的操作,消除微小物,然后在进行分割操作

 

图像的提取

1背景色的处理


图像消除背景色,先提取背影图,然后再进行图像相减(背景色不一致的可以用这个方法)

背景图的提取(开运算)
se = strel('disk',25);
background = imopen(I,se);
figure,imshow(background);


blocks = blkproc(I,[32 32],'min(x(:))');
background = imresize(blocks,[256 256],'bilinear');
�ckground = imresize(blkproc(I,[32 32],'min(x(:))'),[256 256],'bilinear');


减去背景色bw3 = imsubtract(I,background);

图像相减imsubtract(I,J);

图像的开运算imopen(I,se);se = strel('disk',25);


查看背景色是否正常的方法
figure,surf(double(I(1:8:end,1:8:end))),zlim([0 255]);
set(gca,'ydir','reverse');

对一副图像的各种处理中的图像可进行相减来消除一些东西
imsubtract(I,J);

两幅同样的图像可以进行背景去除后的相加操作是特征更加明显
imadd(I,J);
这点和直接加一个数值的区别是后者是整体相加,而前者是亮亮相加


经过灰度变换后使图像的灰度对比很大时就可以进行边缘提取了

边缘提取edge(I);
BW2 = edge(I,'canny');
BW = edge(I,'sobel')
BW = edge(I,'prewitt')
BW = edge(I,'roberts')
BW = edge(I,'log')
bws = edge(I,'sobel',(graythresh(topI)));


先进行灰度划分然后进行边缘检测bws = edge(I,'sobel',(graythresh(I)*.1));

图像块边缘检测J = nlfilter(I,[3 3],inline('max(x(:))'));【tif】【此方法进行边缘的扩充】【邻域检测】

等高线提取imcontour(I),imcontour(I,3);【过程提取比较慢】

形态学的膨胀imdilate(I,se);
【可通过膨胀填补空隙】
bw = imdilate(K,[strel('line',3,90) strel('line',3,0)]);
bwsdil = imdilate(bws,[strel('line',3,90)]);
可参照帮助文档strel和imdilate

空洞的填充J = imfill(I,'holes');J = imfill(I);

移除与边界连通的目标:J= imclearborder(I,4);|J= imclearborder(I);


腐蚀操作:se = strel('diamond',1);J = imerode(I,se);J = imerode(J,se);figure,imshow(J);【此方法可以对边缘进行平滑】


绘制轮廓线J = bwperim(I);

两幅图像叠加的显示segout = I;segout(bwoutline)= 255;figure,imshow(segout);【一般与绘制轮廓线同时使用,是图像分割的方法】

开运算:bwco = imopen(bwc,strel('disk',6));
se = strel('rectangle',[40 30]);
bw2 = imopen(bw1,se);【此方法用来删除图像中较小的物体】

闭运算:bwc = imclose(bw,strel('disk',6));【抽取原始图像较大的物体】

图像“与”操作imshow(bw & bwco)【包含小对象和包含大对象的图像进行“与”操作,从而得到原始图像中所有的小对象】


骨架化b2 = bwmorph(b1,'skel',Inf);【骨架提取适用于道路的提取】
b3 = bwmorph(b1,'remove');【骨骼提取、边缘检测最好先将图像转化为二进制图像】

边缘像素测定bw2 = bwperim(bw1);|BW2 = bwperim(BW1,8);


缨帽变换(高帽滤波变换):J = imtophat(gI,strel('disk',10));【消除背景中那些亮度不一致的背景】

低帽滤波变换Ibot = imbothat(afm,se);figure,imshow(Ibot,[]);

增大对象间的间隙【原图像加上高帽滤波变换的图像,然后再减去低帽滤波的图像】

Ienhance = imsubtract(imadd(Itop,afm),Ibot);


谷点图像的增强,照亮谷点图像
Iec = imcomplement(Ienhance);

你可能感兴趣的:(matlab,disk,filter,im,图形,文档)