目的:利用图像的坐标点,判断出想要分割出的部分,利用 matlab 语法实现分割



1. 基本语法

1.1 定义矩阵

var =[ 1 2 3;
	   4 5 6];

定义一个 2×3 的矩阵,该变量会出现在工作区,可以在命令行用变量输出该矩阵

matlab cnn 图像分割 matlab对图像进行分割_一维数组

1.2 find 函数

find(var)

查找出矩阵 var 中的非零坐标并返回这些坐标的点,可以返回为一维数组或二维数组

当返回给一个变量时,是一个一维数组,数组中存的是矩阵中 非 0 点 的位置编号,原图中的位置编号从上到下、从左到右顺序为1、2、3···

matlab cnn 图像分割 matlab对图像进行分割_像素点_02


当返回给一个矩阵时,将横纵坐标分别赋值给两个矩阵变量,两个变量相同位置的值确定一个非 0 像素点的坐标。

matlab cnn 图像分割 matlab对图像进行分割_像素点_03

可以为 find 中参数指定条件,比如查找大于或等于某个值的元素的坐标:

matlab cnn 图像分割 matlab对图像进行分割_像素点_04

matlab cnn 图像分割 matlab对图像进行分割_像素点_05



1.3 切割图像

a(r1:r2, c1:c2)

返回矩阵或图片的 r1r2 行, c1c2 列,其中每个 " , " 区分一个维度,可以根据需要选择有几个维度。单独一个 " : " 作为一个维度代表选取所有行或列。

图片可以理解为一个矩阵,因为图片是由很多的像素点组成的,每个像素点都有自己的值,不同的值用来表示不同的颜色,因此图片就是一个矩阵。

matlab cnn 图像分割 matlab对图像进行分割_matlab cnn 图像分割_06

2. 图像分割

2.1 切割月亮(1)

将下图中的月亮用以上函数切割成单独的图片。

matlab cnn 图像分割 matlab对图像进行分割_一维数组_07


步骤:

  1. 先转换为二值图,图片在二值图的情况下较好处理。由于二值图只有一个维度,所以只有一个维度的横纵坐标,而每个像素点的取值只有 01 ,方便查找非 0 像素点,从而确定月亮的边界,再在原图找到相应位置,利用上面的函数进行切割。
  2. 利用 find 找到二值图中所有的非 0 元素(二值图黑色为 0,白色为1)。
  3. 找到非 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 ) 选中列坐标的最大值和最小值,是月亮的左右边界;第三维为色彩,用 ’ : ’ 全部选中,显示彩色图

代码运行效果如下:

matlab cnn 图像分割 matlab对图像进行分割_像素点_08