目的:利用图像的坐标点,判断出想要分割出的部分,利用 matlab 语法实现分割
1. 基本语法
1.1 定义矩阵
var =[ 1 2 3;
4 5 6];
定义一个 2×3 的矩阵,该变量会出现在工作区,可以在命令行用变量输出该矩阵
1.2 find 函数
find(var)
查找出矩阵 var 中的非零坐标并返回这些坐标的点,可以返回为一维数组或二维数组
当返回给一个变量时,是一个一维数组,数组中存的是矩阵中 非 0 点 的位置编号,原图中的位置编号从上到下、从左到右顺序为1、2、3···
当返回给一个矩阵时,将横纵坐标分别赋值给两个矩阵变量,两个变量相同位置的值确定一个非 0 像素点的坐标。
可以为 find
中参数指定条件,比如查找大于或等于某个值的元素的坐标:
1.3 切割图像
a(r1:r2, c1:c2)
返回矩阵或图片的 r1 到 r2 行, c1 到 c2 列,其中每个 " , " 区分一个维度,可以根据需要选择有几个维度。单独一个 " : " 作为一个维度代表选取所有行或列。
图片可以理解为一个矩阵,因为图片是由很多的像素点组成的,每个像素点都有自己的值,不同的值用来表示不同的颜色,因此图片就是一个矩阵。
2. 图像分割
2.1 切割月亮(1)
将下图中的月亮用以上函数切割成单独的图片。
步骤:
- 先转换为二值图,图片在二值图的情况下较好处理。由于二值图只有一个维度,所以只有一个维度的横纵坐标,而每个像素点的取值只有 0 或 1 ,方便查找非 0 像素点,从而确定月亮的边界,再在原图找到相应位置,利用上面的函数进行切割。
- 利用 find 找到二值图中所有的非 0 元素(二值图黑色为 0,白色为1)。
- 找到非 0 元素的横纵坐标的范围,截取原图中的这个范围的图片即可。
代码实现:
clear,clc,close all;
f=imread('moon.jpg');
g=rgb2gray(f);
b=imbinarize(g); %转换为二值图
imshow(b);
[r,c]=find(b); %找到非零的坐标赋给[r,c]
result=f(min(r):max(r),min(c):max(c),:); %该句解释在下方
figure,imshow(result);
result=f(min(r):max(r), min(c):max(c),:);
对图片 f 进行切割操作,因为 f 是 rgb 图,有三个维度,所以操作中有三个维度,在上面的 find 函数是在二值图中找到非零的横纵坐标的值,r 中存的是非 0 像素点的行的所有坐标,c 存的是非 0 像素点的列的所有坐标。
根据图像可知,行坐标的最大值和最小值是月亮的上下边界,所以用 min( r ):max( r ) 选中;用 min( c ):max( c ) 选中列坐标的最大值和最小值,是月亮的左右边界;第三维为色彩,用 ’ : ’ 全部选中,显示彩色图
代码运行效果如下: