图像处理算法_第1页
图像处理算法_第2页
图像处理算法_第3页
图像处理算法_第4页
图像处理算法_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1. 直方图.if(m_Image.IsNull()return;int h=m_Image.GetHeight();int w=m_Image.GetWidth();int count256;OnGray();memset(count,0,sizeof(int)*256);/数组初始化for (int i=0;ih;i+)/统计数据for (int j=0;jw;j+)(countm_Image.m_pBits0ij)+; double p256=0.00; /统计概率for (int i=0;i256;i+)pi=(double)counti/a; /*很重要,先转换,后赋值。/上面为直方

2、图,加上下面为均衡化/double s256=0.0; /变换函数for(int i=0;i256;i+)if (i=0)si=pi;elsesi=si-1+pi; int b=0; /变换灰度等级for (int i=0;ih;i+)for (int j=0;jw;j+)int c=m_Image.m_pBits0ij;b=256*sc;m_Image.m_pBits0ij=b;m_Image.m_pBits1ij=b;m_Image.m_pBits2ij=b;Invalidate(1);2. 直方图规格化int h=m_Image.GetHeight();int w=m_Image.Get

3、Width();size=w*h;int count256=0;/统计灰度值for (int i=0;ih;i+)for (int j=0;jw;j+)(countm_Image.m_pBits0ij)+;double p0256=0.0;/统计每个灰度级概率for (int i=0;i256;i+)p0i=(double)counti/(size);double s0256=0.0;/均衡概率和for(int i=0;i256;i+)if (i=0)s0i=p0i; elses0i=s0i-1+p0i;double p1256=0.0;/规定灰度级概率for(int i=0;i256;i+)

4、p1i=(double)(i+128)/(256*256);double s1256=0.0;for(int i=0;i256;i+)/规定灰度级概率和 if (i=0)s1i=p1i; elses1i=s1i-1+p1i;double count0256=0.0;for (int i=0;i256;i+)/找最小的规定灰度级与原灰度级对应double min0=2,minj=0;for (int j=0;j256;j+)if (abs(s0i-s1j)min0)min0=abs(s0i-s1j);minj=j;count0i=minj;for (int i=0;ih;i+)for (int

5、j=0;jw;j+)m_Image.m_pBits0ij=count0m_Image.m_pBits0ij;m_Image.m_pBits1ij=count0m_Image.m_pBits0ij;m_Image.m_pBits2ij=count0m_Image.m_pBits0ij; Invalidate(1);3. 自适应均值滤波 int max_template=dlg.m_max_template; int min_template=dlg.m_min_template; int copy_min_template=min_template; int val=0;/中间值 m_Image

6、.m_nBits= (BYTE*)new BYTE*3;/开辟三维空间 for (int i=0;i3;i+) m_Image.m_nBitsi=(BYTE*)new BYTE*h; for (int i=0;i3;i+) for (int j=0;jh;j+) m_Image.m_nBitsij=new BYTEw; OnGray();/转灰度图像 int *Green=new intmax_template*max_template;/开辟数组空间 int *Blue=new intmax_template*max_template; int *Red=new intmax_templat

7、e*max_template; CCommon com;/调用公共类中函数 for (int i=(max_template-1)/2;ih-(max_template-1)/2;i+) for (int j=(max_template-1)/2;jw-(max_template-1)/2;j+) loop1: int Gcount=0, Bcount=0, Rcount=0;/数组清零 for (int m=i-(min_template-1)/2;m=i+(min_template-1)/2;m+) for (int n=j-(min_template-1)/2;n0&A020&B020)

8、/判断此点是否为最大最小值 val=GreenGcount/2; else val=com.Middle(Green,min_template,min_template); else if (min_templatemax_template)/判断是否小于最大模板 min_template+=2; goto loop1; else val=com.Middle(Green,min_template,min_template); m_Image.m_nBits0ij=val;m_Image.m_nBits1ij=val;m_Image.m_nBits2ij=val;min_template=co

9、py_min_template; 4. 椒盐噪声 double para2=dlg.m_pepper,dlg.m_salt;CCommon com;for (int i=0;ih;+i)for (int j=0;jw;+j)int temp=0;if (com.Random()=1-para1)temp=500;elsetemp=0;m_Image.m_pBits0ij=(m_Image.m_pBits0ij+temp)255?255:(m_Image.m_pBits0ij+temp)255?255:(m_Image.m_pBits1ij+temp)255?255:(m_Image.m_pBi

10、ts2ij+temp)0?0:(m_Image.m_pBits2ij+temp);5. 傅里叶变换 CCommon com;int h_extend=1;/图像进行扩展,寻找2的幂次方int w_extend=1;int h_index=0;int w_index=0; while(h_extend=h) h_extend*=2;h_index+; while(w_extend=w)w_extend*=2;w_index+;complex*pTD=new complexsizeof(complex)*w_extend*h_extend;/分配内存空间complex*pFD=new comple

11、xsizeof(complex)*w_extend*h_extend;for (int i=0;ih_extend*w_extend;i+)/把图像补零pTDi=complex(0,0);for (int i=0;ih;i+)/把图像的值传给pTDfor (int j=0;jw;j+)pTDi*w_extend+j=m_Image.m_pBits0ij*(pow(-1.0,(i+j);/把频谱搬移到中心for (int i=0;ih_extend;i+)com.FFT(&pTDw_extend*i,&pFDw_extend*i,w_index);/对w方向进行快速傅立叶变换for (int i

12、=0;ih_extend;i+)/把pFD进行转置,即进行行列变换,即使不是矩形for (int j=0;jw_extend;j+)pTDh_extend*j+i=pFDw_extend*i+j;/错误点!for (int i=0;iw_extend;i+)com.FFT(&pTDh_extend*i,&pFDh_extend*i,h_index);/对w方向进行快速傅立叶变换,实质是对h方向进行快速傅立叶变换for (int i=0;ih_extend;i+)/对变换结果进行转置,变回原图形for (int j=0;jw_extend;j+)pTDw_extend*i+j=pFDh_exte

13、nd*j+i;for (int i=0;ih_extend;i+)for (int j=0;j255)?255:temp;m_Image_temp.m_pBits0ij=temp;m_Image_temp.m_pBits1ij=temp;m_Image_temp.m_pBits2ij=temp;6. HIS变换CCommon com;CHSI Dlg;/刚开始一直蹦,原因onInitDialog用CComboBoxEx*if (Dlg.DoModal()!=IDOK)return;for (int i=0;ih;i+)for (int j=0;jw;j+)double R=m_Image.m_

14、pBits0ij;double G=m_Image.m_pBits1ij;double B=m_Image.m_pBits2ij;double H,S,I;I=(R+G+B)/3;double num=(2*R-G-B)/2;double den=sqrt(R-G)*(R-G)+(R-B)*(G-B);if (den=0)den=0.01;double cosThita=acos(num/den);if (B=G) /规划的0-1之间H=cosThita/2*pi;elseH=(2*pi-cosThita)/2*pi;int a3=R,G,B;int minrgb=com.Min(a,1,3)

15、;den =R+G+B;if (den=0)den=0.01;S=1-3*minrgb/den;switch(Dlg.m_index)case 0:m_Image.m_pBits0ij=(H*255+0.5);/将分量都扩展的0到255区间,以便显示。+0.5是为了四舍五入m_Image.m_pBits1ij=(H*255+0.5);m_Image.m_pBits2ij=(H*255+0.5);break;case 1:m_Image.m_pBits0ij=(S*255+0.5);/将分量都扩展的0到255区间,以便显示。+0.5是为了四舍五入m_Image.m_pBits1ij=(S*255

16、+0.5);m_Image.m_pBits2ij=(S*255+0.5);break;case 2:m_Image.m_pBits0ij=I+0.5;/将分量都扩展的0到255区间,以便显示。+0.5是为了四舍五入m_Image.m_pBits1ij=I+0.5;m_Image.m_pBits2ij=I+0.5;break;case 3:m_Image.m_pBits0ij=(H*255+0.5);/将分量都扩展的0到255区间,以便显示。+0.5是为了四舍五入m_Image.m_pBits1ij=(S*255+0.5);m_Image.m_pBits2ij=I+0.5;break;defau

17、lt: /要考虑全面break;Invalidate(TRUE);7. 灰度图像降级byte max1=0,max2=0,max3=0,min1=0,min2=0,min3=0;float a;for (int j=0;jh;j+)for (int k=0;kw;k+)BYTE b=m_Image.m_pBits0jk;/B BYTE g=m_Image.m_pBits1jk;/GBYTE r=m_Image.m_pBits2jk;/GBYTE ave=(b+g+r)/3;/变灰度ave=ave/8; /降级m_Image.m_pBits0jk=ave;/不能少,为了图像升级255做准备。m_

18、Image.m_pBits1jk=ave;m_Image.m_pBits2jk=ave;for(int m=0;mh;m+)/最大值for(int n=0;n=max1)max1=m_Image.m_pBits0mn;for(int m=0;mh;m+)/最小值 for(int n=0;nw;n+) if(m_Image.m_pBits0mn=min1) min1=m_Image.m_pBits0mn; for(int m=0;mh;m+)/升级到255for(int n=0;nw;n+)a=255*(m_Image.m_pBits0mn-min1)/(max1-min1);m_Image.m

19、_pBits0mn=a;m_Image.m_pBits1mn=a;m_Image.m_pBits2mn=a;8. 均值滤波m_Image.m_nBits= (BYTE*)new BYTE*3; for(int i=0;i3;i+) m_Image.m_nBitsi = (BYTE*)new BYTE*h; for (int i=0; i3; i+) for (int j=0; jh; j+) m_Image.m_nBitsij=new BYTEw; int templates9= 1,1,1, 1,1,1, 1,1,1;for (int i=1;ih-1;i+)/高斯平滑for (int j=

20、1;jw-1;j+)int sum3=0,0,0;int index3=0,0,0;for (int m=i-1;m=i+1;m+)for (int n=j-1;n=j+1;n+)sum0+=m_Image.m_pBits0mn*templatesindex0+;sum1+=m_Image.m_pBits1mn*templatesindex1+;sum2+=m_Image.m_pBits2mn*templatesindex2+;sum0/=9;sum1/=9;sum2/=9;m_Image.m_nBits0ij=sum0;m_Image.m_nBits1ij=sum1;m_Image.m_nB

21、its2ij=sum2;for (int i=1;ih-1;i+)for (int j=1;jw-1;j+)m_Image.m_pBits0ij=m_Image.m_nBits0ij;m_Image.m_pBits1ij=m_Image.m_nBits1ij;m_Image.m_pBits2ij=m_Image.m_nBits2ij;9. 中值滤波m_Image.m_gits=(BYTE*)new BYTE*3;/定义三个二维数组(三维数组);分配三维动态,创建一个空图像。for(int i=0;i3;i+)m_Image.m_gitsi=(BYTE*)new BYTE*h;for(int i

22、=0;i3;i+)for(int j=0;jh;j+)m_Image.m_gitsij=new BYTEw;for (int i=1;ih-1;i+)/取均值for (int j=1;jw-1;j+)int Rsum9=0,0,0;int Gsum9=0,0,0;int Bsum9=0,0,0;int index3=0,0,0;for (int m=i-1;m=i+1;m+)for (int n=j-1;n=j+1;n+)Rsumindex0+=m_Image.m_pBits0mn;Gsumindex1+=m_Image.m_pBits1mn;Bsumindex2+=m_Image.m_pBi

23、ts2mn;sort(Rsum,Rsum+8);sort(Gsum,Gsum+8);sort(Bsum,Bsum+8);m_Image.m_gits0ij=Rsum4;m_Image.m_gits1ij=Gsum4;m_Image.m_gits2ij=Bsum4;10.CCommon com;for (int i=0;ih;+i)for (int j=0;jw;+j)int a=64;/是把高斯噪声值放大64倍,但没平移,方差为0,,均值为1;如灰度值为负值,则灰度值=255+负值。m_Image.m_pBits0ij=(m_Image.m_pBits0ij+com.Gauss()*a);m_

24、Image.m_pBits1ij=(m_Image.m_pBits1ij+com.Gauss()*a);m_Image.m_pBits2ij=(m_Image.m_pBits2ij+com.Gauss()*a);11. Common 文件void CCommon:FFT(complex * TD,complex * FD,int index)int dotcount=0;/傅立叶变换点数int bfsize=0,p=0;/中间变量double angle;/角度complex *W,*X1,*X2,*X;/定义四个复数dotcount=1index;/傅立叶变换总点数。W=new comple

25、xsizeof(complex)*dotcount/2;/分配内存空间X1=new complexsizeof(complex)*dotcount;X2=new complexsizeof(complex)*dotcount;for (int i=0;idotcount/2;i+)/计算加权系数angle=-i*2*pi/dotcount;Wi=complex(cos(angle),sin(angle);memcpy(X1,TD,sizeof(complex)*dotcount);/要标准for (int k=0;kindex;k+)/采用蝶形运算进行快速傅立叶变换,共index级for (i

26、nt j=0;j1k;j+)/蝶形节排序,从0开始排序bfsize=1(index-k);/每个蝶形节的点数for (int i=0;ibfsize/2;i+)/排序后蝶形节的一半,运用周期性p=j*bfsize;/j个蝶形节的总点数。X2p+i=X1p+i+X1p+i+bfsize/2;X2p+i+bfsize/2=(X1p+i-X1p+i+bfsize/2)*Wi*(1k);/按频域抽选的基-2 FFT算法,加权系数仅挑选一部分X=X1;X1=X2;X2=X;for (int j=0;jdotcount;j+)/倒序 变 顺序p=0;for (int i=0;iindex;i+)if (j

27、&(1i)p+=1(index-i-1);/p=p+1(index-i-1)?FDj=X1p;delete W;delete X1;delete X2;int CCommon:Middle(int s,int a,int b)sort(s,s+a*b);return s(a*b-1)/2;double CCommon:Random(void)/0到1之间的随机数/srand(unsigned)time(NULL); double rand1=rand()/(double)RAND_MAX);return rand1;int CCommon:Min(int s,int a,int b)sort(

28、s,s+a*b);return s0;double CCommon:Gauss(void)/Box-Muller变换:把0-1之间的随机数,变成均值为0,方差为1,高斯分布的随机数static bool hasSpare = false;static double rand1, rand2;if(hasSpare)hasSpare = false;return sqrt(rand1) * sin(rand2);hasSpare = true;rand1 = rand() / (double) RAND_MAX);/RAND_HAX=32767if(rand1 1e-100) rand1 = 1

29、e-100;rand1 = -2 * log(rand1);rand2 = (rand() / (double) RAND_MAX) * TWO_PI;return sqrt(rand1) * cos(rand2);12. /RGB空间转换到 HIS空间void CImage_ProcessingView:OnRgbexchangeHsi() ?if(m_Image.IsNull() return;int w=m_Image.GetWidth();int h=m_Image.GetHeight();m_Image.m_NBits=(BYTE*)new BYTE*3; for (int i=0;

30、i3;i+) m_Image.m_NBitsi=(BYTE*)new BYTE*h; for (int i=0;i3;i+)for (int j=0;jh;j+)m_Image.m_NBitsij=new BYTEw; double H,S,I; double Up,Down,Angle; BYTE B,G,R,Min; CRgbEXChsiDlg hDlg;if (hDlg.DoModal()!=IDOK)return;for (int j=0;jh;j+)for (int k=0;kw;k+)B=m_Image.m_pBits0jk;G=m_Image.m_pBits1jk;R=m_Ima

31、ge.m_pBits2jk;Up=(2*R-G-B)/2.0;Down=sqrt(double(R-G)*(R-G)+(R-B)*(G-B);if (Down=0)Down=0.01;Angle=acos(Up/Down);if (B=G)H=Angle/(2*PI1); elseH=(2*PI1-Angle)/(2*PI1);Min=RG?R:G;Min=BMin?B:Min;S=1-3.0*Min/(B+G+R);I=(B+R+G)/3.0;switch(hDlg.index)case 0:m_Image.m_NBits0jk=int(H*255);m_Image.m_NBits1jk=i

32、nt(H*255);m_Image.m_NBits2jk=int(H*255);break;case 1:m_Image.m_NBits0jk=int(S*255);m_Image.m_NBits1jk=int(S*255);m_Image.m_NBits2jk=int(S*255);break;case 2:m_Image.m_NBits0jk=int(I);m_Image.m_NBits1jk=int(I);m_Image.m_NBits2jk=int(I);break;case 3:m_Image.m_NBits0jk=int(H*255);m_Image.m_NBits1jk=int(

33、S*255);m_Image.m_NBits2jk=int(I);break; for (int j=0;jh;j+)for (int k=0;kw;k+)m_Image.m_pBits0jk=m_Image.m_NBits0jk;m_Image.m_pBits1jk=m_Image.m_NBits1jk;m_Image.m_pBits2jk=m_Image.m_NBits2jk;Invalidate(1);delete m_Image.m_NBits;13/设置矩形框void CImage_ProcessingView:OnLButtonUp(UINT nFlags, CPoint poin

34、t)CClientDC dc(this);CBrush *pBrush=CBrush:FromHandle(HBRUSH)GetStockObject(NULL_BRUSH);CBrush *pOldBrush=dc.SelectObject(pBrush);dc.Rectangle(CRect(m_ptOrigin,point);dc.SelectObject(pOldBrush);Rtopx=m_ptOrigin.x;Rtopy=m_ptOrigin.y;Rbottomx=point.x;Rbottomy=point.y;CScrollView:OnLButtonUp(nFlags, po

35、int);/彩色分割void CImage_ProcessingView:OnColorsegment() if(m_Image.IsNull() return;int w=m_Image.GetWidth();int h=m_Image.GetHeight();int Rw=Rbottomx-Rtopx; int Rh=Rbottomy-Rtopy; int D;/int D0=50;double a3=0,0,0; m_Image.m_NBits=(BYTE*)new BYTE*3; for (int i=0;i3;i+) m_Image.m_NBitsi=(BYTE*)new BYTE*

36、h; for (int i=0;i3;i+)for (int j=0;jh;j+)m_Image.m_NBitsij=new BYTEw; for(int j=Rtopy;jRbottomy;j+) for(int k=Rtopx;kRbottomx;k+)a0+=m_Image.m_pBits0jk;a1+=m_Image.m_pBits1jk;a2+=m_Image.m_pBits2jk;a0=a0/(Rw*Rh);a1=a1/(Rw*Rh);a2=a2/(Rw*Rh);for (int j=0;jh;j+) for (int k=0;k=2000) / 2000 阈值m_Image.m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论