计算原理如下:
假设一副二值,其背景是黑色的,而边缘是白色的,而且白色边缘中不包含黑色的点,就如附件中的那个图像。
程序源码如下:
%% 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中图片点乘、点除的函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)