基于视觉的沙粒形状识别系统模型需要借助计算机对特征的信息处理和分析,实现像人一样的智能识别,所以通常模式识别与机器学习存在着一定的联系。机器识别技术的实现主要分为以下几个步骤:
(1) 获取图像数据。
(2) 数据预处理。
(3) 图像特征提取。
(4) 设置分类器完成分类。
基本流程为:
对采集到的图像主要预处理方式为降噪处理,去除冗余信息,以提高后续特征提取的效率和准确率,使研究对象更加突出。一般采用平滑滤波来对图像进行降噪处理,平滑滤波处理是能够在保证图像细节的基础上对图像的噪声进行抑制和去除,一般对图像的预处理都采用平滑滤波的方式。图像采用中值滤波法进行平滑滤波。
图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。图像平滑往往使图像中的边界、轮廓变得模糊,为了减少这类不利效果的影响,这就需要利用图像锐化技术,使图像的边缘变的清晰。
边缘检测是图形图像处理、计算机视觉和机器视觉中的一个基本工具,通常用于特征提取和特征检测,旨在检测一张数字图像中有明显变化的边缘或者不连续的区域,在一维空间中,类似的操作被称作步长检测。边缘是一幅图像中不同屈原之间的边界线,通常一个边缘图像是一个二值图像。边缘检测的目的是捕捉亮度急剧变化的区域。
Sobel算子结合了高斯平滑和微分求导。它是一阶导数的边缘检测算子,使用卷积核对图像中的每个像素点做卷积和运算,然后采用合适的阈值提取边缘。Soble算子有两个卷积核,分别对应x与y两个方向。
在对图片进行颜色提取和形状特征提取后,根据图片中轮廓信息以及颜色、形状信息对圆形米粒以及椭圆形米粒进行识别,并计算每种米粒的数量。
以下是一个简单的流程:
读取图像:使用imread函数读取米粒图像。
img = imread('rice.png');
预处理图像:对图像进行预处理,例如灰度化、二值化、滤波等操作。
gray_img = rgb2gray(img); % 转换为灰度图像
bw_img = imbinarize(gray_img); % 二值化
filter_img = medfilt2(bw_img, [3, 3]); % 中值滤波
分割图像:将图像中的米粒分割出来,可以使用形态学操作、边缘检测等方法。
se = strel('disk', 5); % 创建一个半径为5的圆形结构元素
open_img = imopen(filter_img, se); % 开运算去除小物体
bw_img2 = edge(open_img, 'canny'); % 边缘检测
se2 = strel('disk', 3); % 创建一个半径为3的圆形结构元素
dilate_img = imdilate(bw_img2, se2); % 膨胀处理
region_img = regionprops(dilate_img, 'Area', 'Centroid'); % 获取连通区域属性
统计米粒数量:统计米粒的数量,可以根据分割出来的连通区域数量来估算米粒数量。
num_rice = length(region_img); % 统计米粒数量
代码如下(示例):
clc
clear all
close all
A1 = imread('./1.jpg'); % 读入图像
A1=rgb2gray(A1); %将彩色图转化为二维的灰度图
I1=im2double(A1);
a=zeros(1,9);
c=zeros(1,9);
I5=I1;
I2=I1;
[row,col]=size(I1);
for i=2:row-1
for j=2:col-1
a=[I2(i,j),I2(i-1,j),I2(i+1,j),I2(i,j-1),I2(i,j+1),I2(i-1,j-1),I2(i-1,j+1),I2(i+1,j-1),I2(i+1,j+1)];
b=sort(a);
I5(i,j)=b(5);
end
end %%
close all
clear all
clc
img=imread('./1.jpg');
I = rgb2gray(img);
% Sobel锐化
% g(i,j)=[dx(i,j)^2+dy(i,j)^2]^(1/2);
% dx = [-1 -2 -1;0 0 0;1 2 1]; dy = [-1 0 1;-2 0 2;-1 0 1];
% 输入原始图像
im = double(I);
H1 = [-1 -2 -1;0 0 0;1 2 1]; dx = filter2(H1,im);
H2 = [-1 0 1;-2 0 2;-1 0 1]; dy = filter2(H2,im);
im2 = sqrt(dx.^2 + dy.^2); % .^2:矩阵中的每个元素都求平方
figure,imshow(uint8(im2));title('Sobel锐化所得的图像');
im3 = im + sqrt(dx.^2 + dy.^2)*0.1;
figure,imshow(uint8(im3));title('锐化所得的图像');
BW5=edge(uint8(im3),'canny'); %用canny算子进行边缘检测
se90=strel('line',3,3);
se0=strel('line',3,3);
BW2=imdilate(BW5,[se90,se0]);
figure,imshow(BW2);
[labeled,numObjects] = bwlabel(BW2,4);
BW3=imfill(BW2,'holes');
[label,num]=bwlabel(BW3,4)
figure,imshow(BW3);
figure;
subplot(1,2,1), imshow(I);title('原图');subplot(1,2,2), imshow(BW5);title('canny');
annotation('textbox',[.9 .5 .1 .2],num,'EdgeColor','none')
figure;
subplot(1,2,1),imshow(I1),title('原图','fontsize',16);
subplot(1,2,2),imshow(I5),title('中值滤波','fontsize',16);
需要注意的是,以上代码只是一个简单的示例,具体的实现方法和参数设置需要根据具体的图像和应用场景来调整和优化