为了制作各种好看的词云标签,一张好的背景图片寻找起来并不容易,例如本文所使用的"汗血宝马"的图片,背景不是我所需要的,如何实现对图像的有效分割?去除背景噪声是本文关注的重点。本文拟采用matlab来实现这个简易的功能。
1.本文将对马进行测试:
2.数字图像背景去除最好的方式有以下几种:
a.PhontoShop,使用选择工具即可;
b.最简单的阈值分割理论;(本文的方法),C++,matlab,python都有实现的包可以供调用。
c.背景差分算法;
3.数字图像阈值分割处理的一般化流程
…1.直接读入图片后,做二值化处理,根据数据游标的取值做初步的分割考察,或者使用imhist绘制图像的像素分布直方图来确定分割像素值;
…2.如果直接阈值分割不行,那可以考虑变换颜色空间来看是否便于基于颜色做图像分割;
…3.在变换了颜色空间的图像上,通过数据游标直接选定大致的阈值,后续再手动改进;
…4.分割后的图像常常会有孔洞,此时需要多次使用形态学方法(进行形态学处理:腐蚀和膨胀)来做孔洞填充;
…5.图像拼接的话需要imresize()成相同大小的图片;
…6.知识迁移到人脸识别应用中来,可以框出人脸位置区域(人脸正面照效果较好)
4.分割马的图像并框选出来马
%function:
% 基于颜色的图像分割;
% 定位图片中的马的区域;
%procession:
% 1.直接读入图片后,做二值化处理,根据数据游标的取值做初步的分割考察;
% 2.如果直接阈值分割不行,那需要考虑变换颜色空间来看是否便于图像分割;
% 3.在变换了颜色空间的图像上,通过数据游标直接选定大致的阈值,后续再手动改进;
% 4.分割后的图像常常会有孔洞,此时需要多次使用形态学方法(进行形态学处理:腐蚀和膨胀)来做孔洞填充;
% 5.图像拼接的话需要imresize()成相同大小的图片;
% 6.知识迁移到人脸识别应用中来,可以框出人脸位置区域(适用于人脸正面照)
clear all;
clc;
close all;
%开始计时
tic
%输入需要识别的图像
[filename,pathname,fi]=uigetfile(...
{'*.*', 'all image file (*.*)';...
'*.bmp','all image file (*.bmp)';...
'*.jpg','all image file (*.jpg)'},...
'请选择要识别的图片',...
'MultiSelect', 'on');
RGB=imread([pathname filename]); %界面手动选择读入方式
%RGB = imread('D:\Program Files\MATLAB\workspace\timg1.jpg'); %直接路径传入读取方式
figure('name','process'),
subplot(2,2,1),imshow(RGB),title('原始RGB'),
%convert frame from RGB to YCBCR colorspace(转换到YCBCR空间)
YCBCR = rgb2ycbcr(RGB);
whos,
subplot(2,2,2),imshow(YCBCR),title('YCBCR'),
%filter YCBCR image between values and store filtered image to threshold
%matrix(用各个通道的阈值对其进行二值化处理)
%% 通过数据游标直接选定大致的阈值,后续再手动改进
%Y_MIN = 40; Y_MAX = 160;
%Cb_MIN = 80; Cb_MAX = 120;
%Cr_MIN = 138; Cr_MAX = 195;
Y_MIN = 30; Y_MAX = 215; %到255也可以
Cb_MIN = 65; Cb_MAX = 135;
Cr_MIN = 138; Cr_MAX = 195; %已经是最佳,否则会引入背景噪声.
threshold1=roicolor(YCBCR(:,:,1),Y_MIN,Y_MAX)&roicolor(YCBCR(:,:,2),Cb_MIN,Cb_MAX)&roicolor(YCBCR(:,:,3),Cr_MIN,Cr_MAX);
subplot(2,2,3),imshow(threshold1),title('YCBCR二值化'),
%perform morphological operations on thresholded image to eliminate noise
%and emphasize the filtered object(s)(进行形态学处理:腐蚀、膨胀、孔洞填充)
dilateElement=strel('square',13) ;
threshold=imdilate(threshold1, dilateElement);
erodeElement = strel('square', 4) ;
threshold = imerode(threshold,erodeElement);
erodeElement = strel('square', 3) ;
threshold = imerode(threshold,erodeElement);
erodeElement = strel('square', 2) ;
threshold = imerode(threshold,erodeElement);
threshold=imfill(threshold,'holes');
subplot(2,2,4),imshow(threshold),title('形态学处理');
% matlab多行注释
%{
erodeElement = strel('square', 2) ;
dilateElement=strel('square',4) ;
threshold = imerode(threshold,erodeElement);
threshold = imerode(threshold,erodeElement);
threshold=imdilate(threshold, dilateElement);
threshold=imdilate(threshold, dilateElement);
threshold=imfill(threshold,'holes');
subplot(2,2,4),imshow(threshold),title('形态学处理'),
%}
%获取区域的'basic'属性, 'Area', 'Centroid', and 'BoundingBox'
figure('name','处理结果')