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

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

计算原理如下:

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

程序源码如下:

%% step 1

clear all

clc

I=imread('testbmp');%读入

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

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/highguihpp"

#include "opencv2/imgproc/imgprochpp"

#include "opencv2/core/corehpp"

#include <opencv\mlh>

#include <iostream>

#include "cvh"

#include "highguih"

#include <vector>

#include <mathh>

#include <stringh>

#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 = srcbegin<uchar>();

Mat_<uchar>::iterator itend = srcend<uchar>();

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

{

n++;

if ((it) > 0)

{

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

}

else {

black += 1;

}

}

double biliB = counter 10 / n 10 100 10;

double biliH = black 10 / n 10 100 10;

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//811416jpg");//读取源图

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

}

一般加入白噪声,只得是加入高斯白噪声

利用randn产生高斯分布噪声加到原来的图像上就可以了

假设你原来的图像的数据存在矩阵变量a中

那么

noise=Arandn(size(a));

其中A是需要加噪声的方差值,A的取值确定噪声的幅度大小

一般比图像信号幅度小得多

b=a+noise;

就是加了噪声之后的图像

1、matlab中的imread相当于OpenCV中的cvLoadImage(imageName, CV_LOAD_IAMGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR):读出的图像信息保持了原有图像的信息(包括通道信息和位深信息);

rgb2gray相当于cvLoadImage(imageName, CV_LOAD_IMAGE_GRAYSCALE):单通道灰度图;

或用cvCreateImage、cvCvtColor两函数实现图像的灰度化。

2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。

3、matlab中的两矩阵点乘 相当于OpenCV中的cvMul函数。

4、matlab中的两矩阵点除 / 相当于OpenCV中的cvDiv函数。

5、matlab中的两矩阵相加 + 相当于OpenCV中的cvAdd函数。

6、matlab中的两矩阵相减 - 相当于OpenCV中的cvSub函数。

7、matlab中的矩阵和一个常量相加 A + a 相当于OpenCV中的cvAddS函数 cvAdds(matA, cvScalar(a), matB)。

8、matlab中的矩阵和一个常量相减 A - a 相当于OpenCV中的cvSubS函数 cvSubS(matA, cvScalar(a), matB)。

9、matlab中的给矩阵赋一初值 A(:, :) = a 相当于OpenCV中的cvSet函数 cvSet(matA, cvScalar(a))。

10、matlab中取矩阵某一部分赋给另一矩阵 A = B(i : j, m : n) 相当于OpenCV中的cvGetSubRect 函数,cvGetSubRect(mat1, mat2, rect)。

11、matlab中取矩阵最大值、最小值 max(max(A))、min(min(A)) 相当于OpenCV中的cvMinMaxLoc函数 cvMinMaxLoc(A, minloc, maxloc)。

12、matlab中两矩阵相乘 A B 相当于OpenCV中的cvMatMul函数,cvMatMul(A, B, C)。

13、matlab中计算两个三维向量的叉积 C = cross(A, B) 相当于OpenCV中的cvCrossProduct函数,cvCrossProduct(A, B, C)。

14、matlab中计算向量的范数 c = norm(A) 相当于OpenCV中的cvNorm函数,c = cvNorm(A)。

15、matlab中求二维矩阵的奇异值分解 [u s v] = svd(A, 0) 相当于OpenCV中的cvSVD函数 cvSVD(A, s, u, v)。

16、matlab中两矩阵左除 c = a / b 相当于OpenCV中的cvInvert、cvMatMul两函数即:cvInvert(a, d); cvMatMul(d, b, c)。

17、matlab中的求矩阵的逆inv函数 A = inv(B) 相当于OpenCV中的cvInvert函数:cvInvert(B,A)。

#define PI 31415926

#define PI2 62831853

#include "stdioh"

#include "mathh"

/ inv=1 forward transform; inv=-1 inverse transform /

fft(float sr[],float sx[],int m0,int inv)

{

int i,j,lm,li,k,lmx,np,lix,mm2;

float t1,t2,c,s,cv,st,ct;

if(m0<0)

return;

inv=-inv;

lmx=1;

for(i=1;i<=m0;++i)

lmx+=lmx; //get 2m0

cv=PI2/(double)lmx;

ct=cos(cv); st=sin(cv)inv;

np=lmx;mm2=m0-2;

/ fft butterfly numeration /

for(i=1;i<=mm2;++i)

{

lix=lmx;lmx/=2;

c=ct;s=st;

for(li=0;li<np;li+=lix)

{

j=li;k=j+lmx;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];sx[j]+=sx[k];sr[k]=t1;sx[k]=t2;

++j;++k;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];sx[j]+=sx[k];

sr[k]=ct1-st2;sx[k]=st1+ct2;

}

for(lm=2;lm<lmx;++lm)

{

cv=c;c=ctc-sts;s=stcv+cts;

for(li=0;li<np;li+=lix)

{

j=li+lm;k=lmx+j;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];sx[j]+=sx[k];

sr[k]=ct1-st2;sx[k]=st1+ct2;

}

}

cv=ct;ct=20ctct-10;st=20stcv;

}

/ 4 points DFT /

if(m0>=2)

for(li=0;li<np;li+=4)

{

j=li;k=j+2;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];

sx[j]+=sx[k];

sr[k]=t1;sx[k]=t2;

++j;++k;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];sx[j]+=sx[k];

sr[k]=-invt2;sx[k]=invt1;

}

/ 2 points DFT /

for(li=0;li<np;li+=2)

{

j=li;k=j+1;

t1=sr[j]-sr[k];t2=sx[j]-sx[k];

sr[j]+=sr[k];sx[j]+=sx[k];

sr[k]=t1;sx[k]=t2;

}

/ sort according to bit reversal /

lmx=np/2;j=0;

for(i=1;i<np-1;++i)

{

k=lmx;

while(k<=j)

{

j-=k;k/=2;

}

j+=k;

if(i<j)

{

t1=sr[j];sr[j]=sr[i];sr[i]=t1;

t1=sx[j];sx[j]=sx[i];sx[i]=t1;

}

}

/ if Inverse FFT, multiply 10/np /

if(inv!=10)

return;

t1=10/np;

for(i=0;i<np;++i)

{

sr[i]=t1;sx[i]=t1;

}

}

main()

{

float xr[2048],xi[2048],xt[2048];

int i,np,nfft,k,nf;

float t,dt,df,f,hf;

float f0=10,f1=20,f2=30;

FILE fp1,fp2;

char fil1[60],fil2[60];

printf("ENTER TIME SIGNAL FILE\n");

scanf("%s",fil1);

printf("ENTER AMPLITUDE SPECTRUM FILE\n");

scanf("%s",fil2);

printf("SAMPLE POINTS\n");

scanf("%d",&np);

printf("SAMPLE INTERVAL(S)\n");

scanf("%f",&dt);

printf("HIGH CUTOFF FREQUENCY(Hz)\n");

scanf("%f",&hf);

fp1=fopen(fil1,"w");

fp2=fopen(fil2,"w");

for(i=0;i<np;i++)

{ t=(i-np/2)dt;

if(t!=00)xt[i]=10/(PIt);

else xt[i]=00;

xr[i]=xt[i];

}

// calculate fft point

k=log(np10)/log(20);

if(np>pow(20,k10))k=k+1;

nfft=pow(20,k10);

df=10/(nfftdt);

nf=hf/df+1;

printf("nfft=%d k=%d\n",nfft,k);

printf("dt=%f df=%f nf=%d\n",dt,df,nf);

// fill zero

if(np<nfft)

{for(i=np;i<nfft;i++)

xr[i]=0;

}

for(i=0;i<nfft;i++)

xi[i]=00;

// calculate fft

fft(xr,xi,k,1);

// output amplitude and argument

for(i=0;i<nf;i++)

{ f=idf;

fprintf(fp2,"%d %82f %124f %124f\n",i,f,atan(xr[i]/xi[i]),sqrt(xr[i]xr[i]+xi[i]xi[i]));

}

fft(xr,xi,k,-1);

for(i=0;i<np;i++)

{ t=idt;

fprintf(fp1,"%10d %104f %104f %104f\n",i+1,t,xt[i],xr[i]);

}

fclose(fp1);

fclose(fp2);

}

一、调用Matlab引擎

调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。下面是调用Matlab中的加法程序addm的例子。

先在Matlab的work目录下创建addm文件并编写程序如下:

function s = add (a, b) s = a+b;在C程序中,首先打开精简版的Matlab

Engine ep = engOpen (NULL);

编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放addm的目录: engEvalString (ep, ”cd \\\\work”);

engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行: engEvalString (ep, ”s=add(a,b)”);

目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

以上就是关于如何用matlab计算二值化图中白色区域的像素点个数全部的内容,包括:如何用matlab计算二值化图中白色区域的像素点个数、如何在matlab的图像中加入高斯白噪声、C++ opencv有没有类似Matlab中图片点乘、点除的函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10123506.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存