上文介绍了MATLAB R2021a中图像工具包及图片导入和基本的处理操作,MATLAB R2021a 图像处理之旅 — 1。接下来我们来看看图像处理技术中图像分割相关的操作。
3 图像分割
图像分割是很多高阶图像效果中的基础处理步骤,如车道线的识别,前景人物识别,后景背景替换等等应用。
3.1 图像二值化
//载入图片
img = imread("IMG_001.jpg");
gs = im2gray(img);
gsAdj = imadjust(gs);
imshow(gsAdj);
//二值化
BW = gsAdj > (255/2);
imshow(BW);
//直接二值化的效果有时并不太好,此时我们需要看一下图像的直方图,进而确认二值化的阈值
imhist(gsAdj);
BW = gsAdj > 200;
imshow(BW);
//除了手动设定阈值,还可以根据图像自动设置阈值,需要调用imbinarize函数
BW = imbinarize(gsAdj);
imshow(BW);
//imbinarize默认是设定图像的全局阈值,可以通过传入adaptive选项使用局部阈值的方式
BWadapt = imbinarize(gsAdj,"adaptive");
imshowpair(BW,BWadapt,"montage");
//imbinarize默认背景色是偏暗的,前景色是偏亮的;如果图像与默认不符,需要调整前景色极性
BWadapt = imbinarize(gsAdj,"adaptive","ForegroundPolarity","dark");
imshowpair(gsAdj,BWadapt,"montage");
3.2 二值图像的处理
经过上述处理后,我们能通常都能得到符合要求的二值图像,接下来我们要对二值图像进行处理得到我们需要的结果。
//导入图片
I = imread("IMG_006.jpg");
gs = im2gray(I);
gsAdj = imadjust(gs);
BW = imbinarize(gsAdj,"adaptive","ForegroundPolarity","dark");
imshowpair(I,BW,"montage");
I2 = imread("IMG_005.jpg");
gs2 = im2gray(I2);
gs2Adj = imadjust(gs2);
BW2 = imbinarize(gs2Adj);
imshowpair(I2,BW2,"montage");
S = sum(BW,2); //计算二值图每行数据之和
plot(S); //画出S对应的数据图
S2 = sum(BW2,2); //计算二值图每行数据之和
plot(S2); //画出S对应的数据图
从以上结果我么可以看出,如果带文字图片的二值化数据和很容易看出规律,而一般图像则不行。但其仍会受到一些其它因素的影响,比如说噪声大,背景纹理干扰等。