Matlab图像处理新手——图像分割和画框显示篇
**前言:**许多人说Matlab对未来的工作没什么用,就目前了解的情况而言并非如此。如:现版本已有matlab转化成C语音的功能;
matlab与DSP(API协议技术)、FPGA、西门子PLC(OPC技术)等。matlab得益于他丰富的库函数。当然,他不能作为硬件的主语言,当作一种手段吧。另外,作为图像处理的新手,希望自己可以坚持写技术博客,像那些大牛一样。总结这方面的知识,方法,具体的实施。。
话不多说,第一篇记录图像分割。先说要处理的目标和要达到的效果。静态物体的分割,达到画框显示和处理后的图片。
分割方法:形态学的腐蚀膨胀。原本想用阈值法的,但是效果不理想。
程序:`
I=imread(‘1.jpg’);%读取图片
I=rgb2gray(I);%灰度化
I=im2double(I);%将输入转换为double类。若输入是uint8类 uint16 类 logical类则函数将其转换为范围[0,1]之间的类,若输入是double类,则函数im2double将返回一个与输入相等的数组.
figure,imshow(I),title(‘原图’);
se=strel(‘disk’,10);%strel用于膨胀腐蚀及开闭运算等操作的结构元素对象;创建半径为10的圆
ft=imtophat(I,se);%对输入的灰度图或二值图I进行形态高帽滤波,高帽滤波计算图像的形态开启(使用imopen),然后从原始图像中减去结果。imtophat使用结构元素SE,其中SE是由strel返回。SE必须是单一的结构元素对象,而不是一个包含多结构元素对象的数组。
Th=graythresh(ft);
Th
G=im2bw(ft,Th);
figure,imshow(G),title(‘局部阈值’);`
画框显示的程序:
function [state,result]=draw_rect(img,startPosition,windowSize,showOrNot)
% 函数调用:[state,result]=draw_rect(img,startPosition,windowSize,showOrNot)
% 函数功能:在图像画个长方形框
% 函数输入:img为原始的大图,可为灰度图,可为彩 {MOD}图
% startPosition 框的左上角在大图中的坐标(每行代表x,y坐标),startPosition=[10,30],分别表示x,y为10,30
% windowSize 框的大小 windowSize=[112,92] 分别表示宽、高
% showOrNot 是否要显示结果?默认为显示出来?
% 函数输出:state – 表示程序结果状态?
% result - 结果图像数据
if nargin < 4
showOrNot = 1;
end
rgb = [255 0 0]; % 边框颜 {MOD}
result = img;
[imgH, imgW] = size(img);
lineSize = 3; % 边框大小,取1,2,3
windowSize(1,1)=windowSize(1,1);
windowSize(1,2) = windowSize(1,2);
if windowSize(1,2) > size(img,1) ||…
windowSize(1,1) > size(img,2)
state = -1; % 说明窗口太大,图像太小,
disp(‘the window size is larger then image…’);
return;
end
if size(img,3) == 3
for k=1:3
for i=1:size(startPosition,1) %矩形框的总数
if(startPosition(i,1)>=0 && startPosition(i,2)>=0)
result(startPosition(i,2),startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k); %画上边框
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);%画右边框
result(startPosition(i,2)+windowSize(i,2),startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k); %画下边框
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1),k) = rgb(1,k); %画左边框
if lineSize == 2 || lineSize == 3
result(startPosition(i,2)+1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1)-1,k) = rgb(1,k);
result(startPosition(i,2)+windowSize(i,2)-1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)-1,k) = rgb(1,k);
if lineSize == 3
result(startPosition(i,2)-1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+windowSize(i,1)+1,k) = rgb(1,k);
result(startPosition(i,2)+windowSize(i,2)+1,startPosition(i,1):startPosition(i,1)+windowSize(i,1),k) = rgb(1,k);
result(startPosition(i,2):startPosition(i,2)+windowSize(i,2),startPosition(i,1)+1,k) = rgb(1,k);
end
end
end
end
end
end
state = 1;
if showOrNot == 1
figure;
hold on;
imshow(result);
end
在这里吐槽一下,关于function的调用也是摸索了一下。。是综合了四个程序,做成自己需要的。在此有所感想,关于码程序这件事,是在诸多程序之中,找到自己想要的,综合,不断地改改改。主函数就不贴出来了,根据自己的情况写就行了。然后综合上面的算法处理部分就完成了。。
接下来要做的1、是基于动态目标的跟踪检测,算法还在研究之中,显示动态的话自然得用自动分割了。。上面的是交互式分割。2、总结出静态目标的分割方法,并码一遍代码。主要是阈值法,区域分割法和分水岭分割法。。