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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用matlab计算二值化图中白色区域的像素点个数相关的知识,希望对你有一定的参考价值。

本人小白,还请大神帮忙写一段求二值化图像中白色区域像素点个数的代码。

计算原理如下:

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

程序源码如下:

%% 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;


参考技术A 下面是一个简单的计算轮廓包含起来的像素点的个数的程序:

%% 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 。
参考技术B

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,黑色像素为 0

% 黑色像素总数 :BCT = sum(BW(:)==0)

追问

一张图片上所有的像素点 怎么计算

追答

% 所有的像素点就是图像的大小

[m,n] = size(BW);
S = m*n;                 % S就是所有的像素点的大小


 

追问

那我希望这个程序能够批量读取图片(图片名称连续编排的),然后求像素点那?

追答pth = 'D:\\photo\\';   % 批量图片路径
fnm = 'img';           % 图片文件前缀
n = 10;                  % 图片文件连排数数
R = zeros(n,1);     % 结果 
for i = 1:n
    fn = ['00' num2str(i)];
    fn = fn(length(fn)-1:end);
    fn = [pth fnm fn '.jpg'];
    P = imread(fn);
    BW = im2BW(P);
    [m,n] = size(BW);
    R(i) = m*n;
end

   

本回答被提问者采纳

python图像处理(二值化)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        边缘检测之后,一般需要对图像进行二值化处理。简单地说,所谓的二值化,就是小于阈值的像素点全部设置为0,也就是黑色点;大于阈值的点,全部设置为255,也就是白色,逻辑还是比较简单的。大家也许会说,为什么要做这个操作?主要还是为了对相似的像素点进行归类使用,让相同属性的像素点靠在一起。

        我们不妨挑一个像素值120作为阈值,看看二值化后的lena图像是什么样子的,

         如图所示,做了二值化后的lena,只有白色和黑色两种像素点。除了一些噪声点之外,大部分临近的点都被组合到了一起,这样比较有利于后期的分割处理。

1、二值化算法

        单看二值化算法,还是比较简单的。本身就是对所有的像素点遍历下,小于某一个阈值,设置为0;大于某一个阈值,设置为255。代码如下所示,

\'\'\'
binary image
\'\'\'

def generate_binary_image(picture, threshold):
    for i in range(picture.shape[0]):
        for j in range(picture.shape[1]):
      

以上是关于如何用matlab计算二值化图中白色区域的像素点个数的主要内容,如果未能解决你的问题,请参考以下文章

如何用matlab对图像进行剪切

如何用C语言实现对图像的二值化?

求助:如何用matlab测量中国地图面积

图像二值化处理Java

对二值化图像的选定区域内的目标彩图的物体颜色进行识别(RGB)并输出,用opencv怎么编写源代码?

解释一下啥是二值化?