Skip to content

Latest commit

 

History

History
102 lines (82 loc) · 5.19 KB

09Image_Processing II.md

File metadata and controls

102 lines (82 loc) · 5.19 KB

以下内容为个人笔记,部分图片来源于郭老师课件或课程截图。 笔记汇总:MATLAB基础教程 课程视频:MATLAB基础教程-台大郭彦甫(14课全-高清-含课件)


为了解决下列问题展开: image-20210131215140272

图像黑白化

对灰阶图像黑白化,即把图像颜色较深的那部分值设为全黑(0),较浅那一部分设为全白(1); 量化来说,就是对于图像的 histogram 图,选取一个合适的值(分界线),将小于这个值的点设置为0,大于的设置为1: image-20210131222851388

图像背景

可以看出,简单的黑白化,会由于图像的整体亮度不均,导致效果不理想; 可以通过去除背景后再黑白化来优化。

图像计数

I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG); level=graythresh(I2);
BW=im2bw(I2, level);
% 计数
[labeled, numObjects]=bwlabel(BW, 8); 
% 上色
RGB_label=label2rgb(labeled); figure; imshow(RGB_label); 
% 给出连通分量的属性
graindata = regionprops(labeled, 'basic'); 
graindata(51) % 查看第51个连通分量的各属性
% 选择连通分量
ObjI = bwselect(BW); figure; imshow(ObjI);

练习

image-20210131234447367

I = imread('rice.png');
imhist(I);
BW = I > 130; % 通过观察图像的histogram选择适当阈值
subplot(121); imshow(BW);
BW2 = I > graythresh(I)*255; % 通过函数计算合适的阈值
subplot(122); imshow(BW2);

实际上,灰阶图转化为黑白图,只需要 I > x 一条语句即可实现,大于阈值 x 的点将置为1,小于的将置为0;关键在于阈值的确定,可以通过观察图像的 histogram 图选择合适的,也可以通过函数计算

image-20210131235244713

I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG); level=graythresh(I2);
BW=im2bw(I2, level);
[labeled, numObjects]=bwlabel(BW, 8);

%% 直方图
num_of_lab = zeros(1,numObjects); %预为哈希表先分配空间
for i=1:size(labeled, 1)
    for j=1:size(labeled, 2)
        index = labeled(i,j);
        if index ~= 0 %如果该点不为0,即被标记了,对应该标记的米粒大小加一
           num_of_lab(index)=num_of_lab(index)+1; %思想类似哈希表
        end
    end
end
histogram(num_of_lab)

%% 上色
r = BW * 255; %把白色部分的red分量置为全红
g = zeros(size(BW)); %green分量和blue分量为全0
b = zeros(size(BW));
red_rice = cat(3,r,g,b); %将RGB三个分量拼接为一个三维的彩图矩阵
figure; imshow(red_rice)

从连通块大小(连通块中像素点个数)的 histogram 中可以看出,连通块大小集中在150到250作用,说明米粒基本上就是这个大小(每个米粒大小差不多); 但居然还存在小于100这样的连通块,这可能是一些噪点或者边界的不完整米粒,可以考虑去除这部分连通块数; 还有大于350的连通块,这可能是两颗米粒相邻比较近,被标记为一个连通块,可以考虑将这部分连通块数乘以2;