图像处理课程上老师布置的任务,要求求出图片rice.png中米粒的个数及其各米粒的大小。

rice.png:

大体步骤是:首先进行边缘检测,然后进行填充。然后进行开运算,可以使一些轻微连着的米粒分开来。然后是遍历图片,把各米粒进行标号,从1开始从小到大标号。每个米粒的各像素点值相同,第i个米粒的各像素点值均为i。其中采用了队列,用数组模拟。最大的米粒标号便是米粒的总个数。最后,遍历一遍图像数组,便可求出各米粒的面积。

参考代码(matlab实现):

clear;
close all;
I = imread('rice.png');
[width,height] = size(I);
J = edge(I,'canny');
%figure,imshow(J);
K = imfill(J,'holes');
%figure,imshow(K);
SE = strel('disk',3);%用于膨胀腐蚀及开闭运算等操作的结构元素对象
%对图像实现开运算,开运算一般能平滑图像的轮廓,消弱狭窄的部分,去掉细的突出。
L = imopen(K,SE);
figure,imshow(L);
L = uint8(L);%把L由logic类型转化为uint8类型
for i = 1:heightfor j = 1:widthif L(i,j) == 1L(i,j) = 255;%把白色像素点像素值赋值为255endend
end
MAXSIZE = 999999;
Q = zeros(MAXSIZE,2);%用数组模拟队列,存储像素点坐标
front = 1;%指明队头的位置
rear = 1;%指明队尾的下一个位置;front=rear表示队空
flag = 0;%米粒的标号for i = 1:heightfor j = 1:widthif L(i,j) == 255%白色像素点入队列if front == rear%队列空,找到新米粒,米粒标号加一flag = flag+1;endL(i,j) = flag;%给白色像素赋值为米粒的标号Q(rear,1) = i;Q(rear,2) = j;rear = rear+1;%队尾后移while front ~= rear%队头出队temp_i = Q(front,1);temp_j = Q(front,2);front = front + 1;%把队头位置像素点8连通邻域中未作标记的白色像素点入队,并加上米粒标号%左上角的像素点if L(temp_i - 1,temp_j - 1) == 255L(temp_i - 1,temp_j - 1) = flag;Q(rear,1) = temp_i - 1;Q(rear,2) = temp_j - 1;rear = rear + 1;end%正上方的像素点if L(temp_i - 1,temp_j) == 255L(temp_i - 1,temp_j) = flag;Q(rear,1) = temp_i - 1;Q(rear,2) = temp_j;rear = rear + 1;end%右上方的像素点if L(temp_i - 1,temp_j + 1) == 255L(temp_i - 1,temp_j + 1) = flag;Q(rear,1) = temp_i - 1;Q(rear,2) = temp_j + 1;rear = rear + 1;end%正左方的像素点if L(temp_i,temp_j - 1) == 255L(temp_i,temp_j - 1) = flag;Q(rear,1) = temp_i;Q(rear,2) = temp_j - 1;rear = rear + 1;end%正右方的像素点if L(temp_i,temp_j + 1) == 255L(temp_i,temp_j + 1) = flag;Q(rear,1) = temp_i;Q(rear,2) = temp_j + 1;rear = rear + 1;end%左下方的像素点if L(temp_i + 1,temp_j - 1) == 255L(temp_i + 1,temp_j - 1) = flag;Q(rear,1) = temp_i + 1;Q(rear,2) = temp_j - 1;rear = rear + 1;end%正下方的像素点if L(temp_i + 1,temp_j) == 255L(temp_i + 1,temp_j) = flag;Q(rear,1) = temp_i + 1;Q(rear,2) = temp_j;rear = rear + 1;end%右下方的像素点if L(temp_i + 1,temp_j + 1) == 255L(temp_i + 1,temp_j + 1) = flag;Q(rear,1) = temp_i + 1;Q(rear,2) = temp_j + 1;rear = rear + 1;endendendend
end
figure,imshow(L);
RiceNumber = flag;%记录米粒的总个数
disp('米粒的总个数:')
RiceNumber
RiceArea = zeros(1,RiceNumber);%记录各米粒的大小
for i = 1:heightfor j = 1:widthif L(i,j) ~= 0RiceArea(L(i,j)) = RiceArea(L(i,j)) + 1;endend
end
disp('各米粒的大小(按照从上往下,从左往右的顺序):')
RiceArea

运行结果:

边缘检测,填充,开运算之后的结果:

可以看出有些轻微连着的米粒被分开了。

进行标号后的结果:

米粒是从上到下从左到右依次编号的。从图中米粒的明暗程度可以看出来。

最终结果:

米粒的总个数:

RiceNumber =

69

各米粒的大小(按照从上往下,从左往右的顺序):

RiceArea =

Columns 1 through 20

212   146   197   179   224   431   208   182   147   189   236   214   207   202   138   188   158   202   210   181

Columns 21 through 40

186   211   199   227   203   223   224   227   249   254   225   187   183   200   232   199   210   200   198   183

Columns 41 through 60

230   268   233   235   193   206   240   158   207   215   238   200   239   227   207   254   237   203   211   236

Columns 61 through 69

219   152   225   238   169   223   215   195   195

有一个比较简单的方法是直接调用bwlabel函数,进行连通域标记。不过老师要求尽量不要调用这些库函数,自己把他实现出来,这样理解的深刻一些,更好地提高编程能力。

clear;
close all;I=imread('rice.png');
%imshow(I);
J=edge(I,'canny');
%figure,imshow(J);
K=imfill(J,'holes');
figure,imshow(K);
SE=strel('disk',3);%用于膨胀腐蚀及开闭运算等操作的结构元素对象
%对图像实现开运算,开运算一般能平滑图像的轮廓,消弱狭窄的部分,去掉细的突出。
L=imopen(K,SE);
figure,imshow(L);M=bwlabel(L,4);%8联通域标记
figure,imshow(M,[]);%矩阵M的大小
[m,n]=size(M);
num=0;%米粒的个数for i=1:mfor j=1:nif M(i,j)>num%最大的label值即联通域的个数num=M(i,j);endend
end
area=zeros(1,num);%记录各个米粒的大小
for i=1:mfor j=1:nif M(i,j)>0%不是背景,在联通域里面area(1,M(i,j))=area(1,M(i,j))+1;%对应的米粒大小加一endend
end
disp('米粒个数:');
disp(num);
disp('各个米粒的大小');
area

【数字图像处理】求图像rice.png中米粒个数相关推荐

  1. 最简单的代码【数字图像处理】计算rice.png中米粒个数

    图像处理课程上老师布置的任务,要求求出图片rice.png中米粒的个数及其各米粒的大小. 本来开始的时候我们不是很会做,就去百度或者去博客园上面查找别人的代码,发现都很长.少则三四十行,多则五六十行. ...

  2. 数字图像处理--基本图像操作

    数字图像处理–基本图像操作 1 主要内容 (1)搭建能运行图像算法程序的平台: (2)独立完成matlab矩阵基本操作,如矩阵信息的提取包括获取矩阵大小.矩阵维数.矩阵元素个数.向量长度和矩阵乘法等操 ...

  3. 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验

    图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...

  4. 数字图像处理之图像基础

    最近在学数字图像处理,图像基础包括以下部分: 导入库 import numpy as np import matplotlib.pyplot as plt import cv2 as cv 图片展示函 ...

  5. 数字图像处理:图像的频域

    数字图像处理:图像的频域 一.图像高频信号和低频信号的理解 1.1 图像中的低频信号和高频信号也叫做低频分量和高频分量. 1)空间频率指的是图像中灰度值相对它的邻居点变化方式.如果一副图像中灰度从一边 ...

  6. 数字图像处理:图像金字塔

    转载请标明出处:数字图像处理:图像金字塔_数字图像处理opencv_新浪博客 (一)概念 以多个分辨率来表示图像的一种有效且概念简单的结构是图像金字塔.图像金字塔最初用于机器视觉和图像压缩,一个图像金 ...

  7. 数字图像处理 - Ch2 图像取样与量化

    数字图像处理 Ch2 图像取样与量化 图像取样与量化 概念 数字图像表示 线性索引与坐标索引 空间分辨率 & 灰度分辨率 图像内插 1. 最近邻内插 2. 双线性内插 3. 双三次内插 其他方 ...

  8. 数字图像处理:图像的灰度变换(Matlab实现)

    数字图像处理:图像的灰度变换(Matlab实现) (1)线性变换: 通过建立灰度映射来调整源图像的灰度. k>1增强图像的对比度:k=1调节图像亮度,通过改变d值达到调节亮度目的:0 i = i ...

  9. 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)

    目录 1 灰度变换简介 2 线性灰度变换­-图像反转 3 非线性灰度变换 3.1 对数变换 3.2 伽马变换 参考资料 1 灰度变换简介 灰度变换是图像增强的一种重要手段,用于改善图像显示效果,属于空 ...

最新文章

  1. 【python教程入门学习】如何把Python学好
  2. c语言用户输入编程,C语言入门教程-Printf:读取用户输入
  3. java Ajax cache_ajax之cache血与泪~~
  4. ARIMA模型的介绍
  5. thincmf 分页无法搜索_分页的bug ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...
  6. Leetcode - 广度优先遍历专题
  7. 数据库创建存储过程_创建存储过程来修复孤立的数据库用户
  8. 后端自我介绍_新人入职自我介绍
  9. 二维随机变量期望公式_多维随机变量函数的分布
  10. HTML5是不是解决跨平台问题的终极密钥
  11. 不使用脚手架搭建vue项目
  12. windbg 查看结构体_Windbg入门实战讲解
  13. Android 10.0强制所有app横屏显示
  14. 【C++】packaged_task的用法实例
  15. VBA编程实例----绘制李萨茹图形
  16. Ural 1671. Anansi's Cobweb
  17. 如何使用easywechat开发微信支付功能
  18. 基于selenium的QQ空间自动点赞功能(2020年7月版)
  19. USB输入单节锂电池0.5A充电管理IC,防高压40V保护电路-7号电路板
  20. 计算机校本培训心得,校本研修学习心得体会范文3篇

热门文章

  1. HDFS文件系统存储机制
  2. python的标准类型内建函数_Python内建函数
  3. SQL 拼接语句输出_一文了解Mybatis中动态SQL的实现
  4. word格式:导出与导入(如何将一套格式样式应用于另一个文档)- 教程篇
  5. VSCode中配置git(参数设置) - 教程篇【不推荐阅读】
  6. phpcmsV9留言板 - 提交后提示页UI自定义效果
  7. php清轩聚合登录平台网站源码
  8. 向日葵企业版 v2.0.0.17075
  9. fidde调试手机_实操:手机上用Fiddler调试页面(嘎)
  10. 亲测无限坐席在线客服系统源码