1.function [center, r] = solve_circle(pt1, pt2, pt3)2.%Effect: solve the circle which across points 'pt1', 'pt2' and 'pt3'3.%Inputs:4.%pt1, pt2, pt3: [x, y]5.%center: the circle center [x0; y0]6.%r: the radius of the circle7.%Author: Su dongcai at 2012/1/28. A = zeros(2, 2); B = zeros(2, 1);9.[A(1, :), B(1)] = circle2line(pt1, pt2);10.[A(2, :), B(2)] = circle2line(pt2, pt3);11.center = A\B;12.r = norm(pt1' - center);13.14.function [A, B] = circle2line(pt1, pt2)15.%Effect: cast 2 circles equation into 1 linear equation:16.%(a-x1)^2 + (b-y1)^2 = r^2 |17.% |==> 2(x1-x2)a + 2(y1-y2)b = (x1^2 + y1^2) - (y2^2 + y2^2)18.%(a-x2)^2 + (b-y2)^2 = r^2 |19.%Inputs:20.%pt1, pt2: [x1, y1], [x2, y2]21.%Outputs:22.%A: 2[x1-x2, y1-y2]23.%B: (x1^2 + y1^2) - (x2^2 + y2^2)24.%Author: Su dongcai at 2012/1/225.A = 2*(pt1 - pt2);26.B = norm(pt1)^2 - norm(pt2)^2;close all;clear;clc;>> i=imread('rice.png');%>> imshow(i);>> background=imopen(i,strel('disk',15));>> i2=imsubtract(i,background);%>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);%>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);%>> figure,imshow(bw);>> [labeled,numobjects]=bwlabel(bw,4);graindata=regionprops(labeled,'all');close all;clear;clc;i=imread('rice.png');background=imopen(i,strel('disk',15));i2=imsubtract(i,background);i3=imadjust(i2,stretchlim(i2),[0 1]);level=graythresh(i3);bw=im2bw(i3,level);[labeled,numobjects]=bwlabel(bw,4);data=regionprops(labeled,'all');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%2006.6.2close all;clear;clc;>> i=imread('r.jpg');%>> figure,imshow(i);>> imgray=rgb2gray(i);>> figure,imshow(imgray)>> background=imopen(imgray,strel('disk',15));>> i2=imsubtract(imgray,background);%>> figure,imshow(i2);>> i3=imadjust(i2,stretchlim(i2),[0 1]);%>> figure,imshow(i3);>> level=graythresh(i3);>> bw=im2bw(i3,level);%>> figure,imshow(bw);>> imnobord=imclearborder(bw,4);%>> figure,imshow(imnobord);>> [labeled,numobjects]=bwlabel(bw,4);>> rgb_label=label2rgb(labeled,@spring,'c','shuffle');>> figure,imshow(rgb_label);>> graindata=regionprops(labeled,'all');hold on;for k=1:numobjectslab=sprintf('%d',k);text(graindata(k).Centroid(1),graindata(k).Centroid(2),lab,'Color','k'); endhold off;%剔除碎米粒>> idxdown=find([graindata.Area]<150); %剔除碎米粒little=ismember(labeled,idxdown);figure,imshow(little);[lab_little,num_little]=bwlabel(little,4);rgb_little=label2rgb(lab_little,@spring,'c','shuffle');figure,imshow(rgb_little);little_data=regionprops(lab_little,'all');hold on;for k=1:num_littlelab=sprintf('%d',k);text(little_data(k).Centroid(1),little_data(k).Centroid(2),lab,'Color','k'); endhold off;%>> graindata(idxdown,:)=[];%剔除碎米粒%剔除连接米粒>> idxup=find([graindata.Area]>250); %剔除连接米粒big=ismember(labeled,idxup);figure,imshow(big);[lab_big,num_big]=bwlabel(big,4);rgb_big=label2rgb(lab_big,@spring,'c','shuffle');figure,imshow(rgb_big);big_data=regionprops(lab_big,'all');hold on;for k=1:num_biglab=sprintf('%d',k);text(big_data(k).Centroid(1),big_data(k).Centroid(2),lab,'Color','k');endhold off;%>> graindata(numup,:)=[];%剔除连接米粒%获取完整米粒idxsuit=find([graindata.Area]>=150&[graindata.Area]<=250);suit=ismember(labeled,idxsuit);figure,imshow(suit); %获取完整米粒[lab_suit,num_suit]=bwlabel(suit,4);suit_data=regionprops(lab_suit,'all');hold on;for k=1:num_suitsignature=sprintf('%d',k);text(suit_data(k).Centroid(1),suit_data(k).Centroid(2),signature,'Color','r'); endhold off;%获取完整米粒whos graindatawhos little_datawhos big_datawhos suit_data>> graindata>> mean([graindata.Area])>> mean([graindata.Eccentricity])>> mean([graindata.MajorAxisLength])>> mean([graindata.MinorAxisLength])>> mean([graindata.EquivDiameter])>> figure,hist([graindata.Area],20);>> figure,hist([graindata.Eccentricity],20);>> figure,hist([graindata.MajorAxisLength],20);>> figure,hist([graindata.MinorAxisLength],20);>> figure,hist([graindata.EquivDiameter],20);data=[graindata.Area]data=[graindata.Centroid]data=[graindata.BoundingBox]data=[graindata.SubarrayIdx]data=[graindata.MajorAxisLength]data=[graindata.MinorAxisLength]data=[graindata.Eccentricity]data=[graindata.Orientation]data=[graindata.ConvexHull]data=[graindata.ConvexImage]data=[graindata.ConvexArea]data=[graindata.Image]data=[graindata.FilledImage]data=[graindata.FilledArea]data=[graindata.EulerNumber]data=[graindata.Extrema]data=[graindata.EquivDiameter]data=[graindata.Solidity]data=[graindata.Extent]data=[graindata.PixelIdxList]data=[graindata.PixelList]Area 计算各个连通区域中的象素总数BoundingBox 包含相应区域的最小矩形Centroid 给出每个区域的质心MajorAxisLength 与区域具有相同标准二阶中心矩(又叫标准差)的椭圆的长轴长度MinorAxisLength 与区域具有相同标准二阶中心矩的椭圆的短轴长度Eccentricity 与区域具有相同标准二阶中心矩的椭圆的离心率Orientation 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角Image 二值图像,与某区域具有相同大小的逻辑矩阵。