今晚图像处理课.
我已经把Matlab当作PhotoShop来学了, 看看能把我的照片处理成什么样子.
上节课学了8.6节图像分割
今天学习8.6节二值图像处理
图像的边沿不太光滑的时候可以使用该方法处理边缘.
腐蚀可以把连在一起的图片分开.
腐蚀的代码:
originalBW = imread('circles.png');se = strel('disk', 10);erodedBW = imerode(originalBW, se);imshow(originalBW), figure, imshow(erodedBW)
结果:
通过腐蚀之后, 可以数清楚图片中有多少个圆形.
膨胀的代码:
bw = imread('text.png');se = strel('line',5,90);bw2 = imdilate(bw, se);imshow(bw), title('Original')figure, imshow(bw2), title('Dilated')
结果:
膨胀之后使得字体变形.
这是我的头像膨胀后的样子, 果然很膨胀
8.6.2 开运算和闭运算
开运算: 先腐蚀再膨胀, 消除图像的细节.
比运算: 先膨胀再腐蚀, 填充物体内部的细小的空洞.
开运算结果:
闭运算结果:
填洞的操作, 将图片内部的黑色的空洞处理掉才能够方便的对图像进行后续的处理.
代码:
I=imread('coins.png');BW4 = im2bw(I);BW5 = imfill(BW4, 'holes');imshow(BW4), figure, imshow(BW5)
填洞后的结果, 可以看出每个圆圈的外表都十分的光滑, 内部的黑色的洞都没有了.
10.4.1 简单的区域描述
regionprops()函数
常见的拓扑结构:
孔洞
10.4.3: 形状的描述
1、和圆形有多接近,方法: 面积/周长
2、偏心度
案例: 测试图片的重心, 从而可以判断有多少个硬币:
上代码:
clearclc;close all;I=imread('coins.png');BW4 = im2bw(I);BW5 = imfill(BW4, 'holes');imshow(BW4), figure, imshow(BW5)s = regionprops(BW5, 'centroid');centroids = cat(1, s.Centroid);[m, n]=size(centroids);imshow(I)hold onplot(centroids(:, 1), centroids(:,2), 'b*')hold offm
计算出总数:
综合的例子, 不仅可以计算有多少个硬币, 同时可以计算出金额总和:
上代码:
%读取图像RGB = imread('coins.jpg');%I=rgb2gray(RGB);I=RGB;%阈值分割图像threshold = graythresh(I);bw = im2bw(I,threshold);bw=~bw;bw = bwareaopen(bw,100);se = strel('disk',2);bw = imclose(bw,se);bw = imfill(bw,'holes');[B,L] = bwboundaries(bw,'noholes');stats = regionprops(L,'Area','Centroid');array=zeros(1,length(B));%求硬币的直径for k = 1:length(B) boundary = B{k}; delta_sq = diff(boundary).^2; perimeter = sum(sqrt(sum(delta_sq,2))); radius=perimeter/(2*pi); array(k)=radius;end%分类B=sort(array);row=length(B);maxcoin=max(B);mincoin=min(B);for i=1:row if(abs(B(i)-maxcoin)<2) B(i)=10; elseif (abs(B(i)-mincoin)<2) B(i)=1; else B(i) = 5; endend%输出钱数c=sum(B)
结果: