如何用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;
%% 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
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)
一张图片上所有的像素点 怎么计算
追答% 所有的像素点就是图像的大小
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计算二值化图中白色区域的像素点个数的主要内容,如果未能解决你的问题,请参考以下文章