如何用matlab计算二值化图中白色区域的像素点个数

本人小白,还请大神帮忙写一段求二值化图像中白色区域像素点个数的代码。... 本人小白,还请大神帮忙写一段求二值化图像中白色区域像素点个数的代码。 展开
 我来答
珈蓝惜梦qF
2020-01-12 · TA获得超过654个赞
知道答主
回答量:33
采纳率:0%
帮助的人:1.3万
展开全部

计算原理如下:

假设一副二值图片,其背景是黑色的,而边缘是白色的,而且白色边缘中不包含黑色的点,就如附件中的那个图像。

程序源码如下:

%% step 1

clear all

clc

I=imread('test.bmp');%读入图片

bwI=im2bw(I,0.5);%转化为二值图像

L=bwlabel(bwI,4);%将四连通区域进行标记

[r,c]=find(L==1);%查找其中的白色区域,r是白点的所在行组成的向量,c是白点所在的列组成的向量

%% step 2 %去除r中重复的数

new_r=[];

for i=1:length(r)

    nn=find(new_r==r(i));

    if isempty(nn),new_r=[new_r r(i)];end

end

%% step 3

sum_zeros=0;%轮廓中总的点的个数

for i=1:length(new_r)

    n=find(bwI(new_r(i),:)==1);%查找有白点的行中白点所在的位置

    if length(n)==1,continue;end%如果该行中只有一个白点,则返回

    num_zeros=n(end)-n(1)+1-length(n);%否则计算夹在白点之间的黑点的个数

    sum_zeros=sum_zeros+num_zeros;

end

二值化图实例如下(即黑白两色):


扩展资料:

C语言实现源码:

#include "opencv2/highgui/highgui.hpp" 

#include "opencv2/imgproc/imgproc.hpp" 

#include "opencv2/core/core.hpp"

#include <opencv\ml.h>

#include <iostream>

#include "cv.h"

#include "highgui.h"

#include <vector>

#include <math.h>

#include <string.h>

#include <fstream>

using namespace std;

using namespace cv;

//统计一幅图片中白色像素点和黑色像素点占整幅图的比例

int bSums(Mat src)

{

 int counter = 0;

 int black = 0;

 int n = 0;

 //迭代器访问像素点

 Mat_<uchar>::iterator it = src.begin<uchar>();

 Mat_<uchar>::iterator itend = src.end<uchar>();

 for (; it != itend; ++it)

 {

  n++;

  if ((*it) > 0)

  {

   counter += 1;//二值化后,像素点是0或者255

  }

  else {

   black += 1;

  }

 }

 double biliB = counter * 1.0 / n * 1.0 * 100 * 1.0;

 double biliH = black * 1.0 / n * 1.0 * 100 * 1.0;

 cout << "counter:" << counter << endl;

 cout << "black:" << black << endl;

 cout << "n:" << n << endl;

 cout << "biliB:" << biliB << endl;

 cout << "biliH:" << biliH << endl;

 return counter;

}

int main(int agrc, char** agrv)

{

 Mat imgPath = imread("D://XR//811416.jpg");//读取源图

 //namedWindow("原图", 0);

 //resizeWindow("原图", 500, 500);

 imshow("原图", imgPath);

 Mat a1;

 cvtColor(imgPath, a1, COLOR_BGR2GRAY);//转灰度图

 //namedWindow("灰度", 0);

 //resizeWindow("灰度", 500, 500);

 imshow("灰度", a1);

 Mat a2;

 threshold(a1, a2, 0, 255, THRESH_BINARY | THRESH_OTSU);//二值化

 //namedWindow("灰度", 0);

 //resizeWindow("灰度", 500, 500);

 imshow("灰度", a2);

 int a = bSums(a2);//调用函数bSums

 imshow("A", a2);

 //cout << "A:" << a;

 waitKey();

 return 0;

}

shine戚七七
推荐于2017-09-08 · TA获得超过4.7万个赞
知道大有可为答主
回答量:2万
采纳率:75%
帮助的人:2691万
展开全部
下面是一个简单的计算轮廓包含起来的像素点的个数的程序:

%% step 1
clear all
clc
I=imread('test.bmp');%读入图片
bwI=im2bw(I,0.5);%转化为二值图像
L=bwlabel(bwI,4);%将四连通区域进行标记
[r,c]=find(L==1);%查找其中的白色区域,r是白点的所在行组成的向量,c是白点所在的列组成的向量
%% step 2 %去除r中重复的数
new_r=[];
for i=1:length(r)
nn=find(new_r==r(i));
if isempty(nn),new_r=[new_r r(i)];end
end
%% step 3
sum_zeros=0;%轮廓中总的点的个数
for i=1:length(new_r)
n=find(bwI(new_r(i),:)==1);%查找有白点的行中白点所在的位置
if length(n)==1,continue;end%如果该行中只有一个白点,则返回
num_zeros=n(end)-n(1)+1-length(n);%否则计算夹在白点之间的黑点的个数
sum_zeros=sum_zeros+num_zeros;
end

就是这样的,比如这一行是这样的001110000011100,那么step3中的n就是一个向量:3 4 5 11 12 13,这六个数分别是这行中白点的位置,那么其中的夹在1之间的0的个数就是:13-3+1-6=5 。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qingningleyun
推荐于2017-09-22 · TA获得超过5854个赞
知道大有可为答主
回答量:2991
采纳率:30%
帮助的人:3048万
展开全部

fn = '000.jpg';
P = imread(fn);
BW = im2bw(P);
subplot(211); imshow(P);
subplot(212); imshow(BW);
WCT = sum(BW(:))

WCT =


      250546

更多追问追答
追问
我之前编写了一个把灰度图转化为二值图的代码,现在我想在这个代码的基础上,直接求出转化后的二值图像的白色区域像素点数。。小白不要见笑啊,还望能得到你的帮助,字数限制,不能把我那个代码上传。
追答
% 把灰度图转化为二值图后,直接求和就可以了

% 如转换后为 BW
WDCT = sum(BW(:)) % WDCT 就是二值图像的白色区域像素点数
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式