在图像获取,传输过程中有许多因素会使图像变得模糊。图像模糊的实质是图像受到了求和,平均或者积分运算,因此可以用相反的运算来消除模糊,叫做图像的鋭化。
图像鋭化的其中一个方法是拉普拉斯(Laplacian)算子,拉普拉斯算子是线性2次微分算子,具有各向同性和位移不变性。
对于连续图像f(x,y),他的拉普拉斯算子为
D^2 f = @^2 f(x,y)/@x^2+@^2 f(x,y)/@y^2 编辑关系,左式D表示Delta符号,D^2表示Delta平方,@是偏导符号,@^2 f(x,y)/@x^2 是f(x,y)对x的2次偏导数....-__-++!
处理过程为 g(x,y)=f(x,y)-k*D^2 f 即目标灰度是原始灰度减去拉普拉斯算子的k倍,k是系数
对于数字图像矩阵,拉普拉斯算子变成 D^2 f(x,y)=Dx^2 f(x,y)+ Dy^2 f(x,y) 上面Dx^2 f(x,y)=Dx(Dx f(x,y))=Dx(f(x+1,y)-f(x,y))=D f(x+1,y)-D f(x,y)=f(x+1,y)-f(x,y)-f(x,y)+f(x-1,y) =f(x+1,y)+f(x-1,y)-2*f(x,y) 类似求得 Dy^2 f(x,y)=f(x,y+1)+f(x,y-1)-2* f(x,y) 所以 D^2 f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y-1)+f(x,y+1)-4*f(x,y) 鋭化后得图像为 g(x,y)=f(x,y)-D^2 f(x,y)
下面是根据整个算法对24位彩色BMP图像鋭化得BCB6程序 //------------------------------------------BCB6程序
#include <vcl.h> #pragma hdrstop #include<stdio.h> #include "Unit1.h" #include"File1.h" #include<math.h>
#pragma pack(1)
/* 程序:图形学-拉普拉斯算子图像鋭化 作者:sboom(Lingch) 日期:12月26日 */ //BMP文件头 struct BITMAPFILEHEADER_ { short type; int bfSize; short re1,re2; int Offbits; }; //BMP信息头 struct BITMAPINFO_ { long size; long width,height; short planes,bitCount; long comp,sizeImg; long xpels,ypels; long used,important; }; //BMP彩色表项 struct COLOR_ { char blue,green,red; }; //------将BMP彩色表的数据校正到BCB 的TColor的数据。 TColor* SwitchColor(unsigned char r,unsigned char g,unsigned char b) { TColor *re=new TColor; *re=(r | g<<8 | b<<16 ); *re=*re & 0x00ffffff; return re; }
void xxx() { FILE *f=fopen("f:\\8.bmp","rb"); if(f==NULL) /*判断文件是否打开成功*/ { ShowMessage("File open error"); return; }
fseek(f,0,0);//移动到开头
//----------读BMP文件头 BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_(); if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL) { ShowMessage("File read error"); return; }
//-----------读BMP信息头 BITMAPINFO_ *bmpi=new BITMAPINFO_(); if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL) { ShowMessage("File read error2"); return; } fseek(f,bmph->Offbits,0); //----------显示一些信息 Form1->Edit1->Text=IntToStr(bmph->bfSize); Form1->Edit2->Text=IntToStr(bmpi->width); Form1->Edit3->Text=IntToStr(bmpi->height); Form1->Edit4->Text=IntToStr(bmpi->comp); Form1->Edit5->Text=IntToStr(bmpi->used);
int i,j,k,l,wc,pos; long N=bmph->bfSize- bmph->Offbits;//象素总数 COLOR_ *image=new COLOR_[N]; //位图矩阵 COLOR_ *newimage=new COLOR_[N];//滤波后的位图矩阵
fread(image,N*3,1,f);//读入位图矩阵 long t=0;
//!!!!!!!!!!!!!!!下面进行鋭化处理!!!!!!!!!!!!!!!!!!!!!!!! for(i=1;i<N-bmpi->width;i++) //最后一行无法求梯度 { t=image[i+1].red+image[i-1].red+image[i+bmpi->width-1].red+image[i+bmpi->width+1].red-4*image[i].red; newimage[i].red=image[i].red-t;
t=image[i+1].green+image[i-1].green+image[i+bmpi->width-1].green+image[i+bmpi->width+1].green-4*image[i].green; newimage[i].green=image[i].green-t;
t=image[i+1].blue+image[i-1].blue+image[i+bmpi->width-1].blue+image[i+bmpi->width+1].blue-4*image[i].blue; newimage[i].blue=image[i].blue-t; } //!!!!!!!!!!!!!!!进行鋭化处理结束!!!!!!!!!!!!!!!!!!!!!!!! //---------------显示图形 COLOR_ color; TColor *tc; if(bmpi->width%4==0)//-----------因为BMP图像4字节对齐 wc=bmpi->width/4*4; else wc=(bmpi->width/4+1)*4;
pos=0; for( i=0;i<bmpi->height;i++) { for(j=0;j<wc;j++) { //-----原始图形 color=image[pos]; tc=SwitchColor(color.red,color.green,color.blue); Form1->Canvas->Pixels[10+j][600-i]=*tc; //------新图形 color=newimage[pos]; tc=SwitchColor(color.red,color.green,color.blue); Form1->Canvas->Pixels[400+j][600-i]=*tc; pos++; } } fclose(f); }
//------------------------------------------ 在对一幅24位BMP彩色图像鋭化后发现,灰度变化平缓得平面区域鋭化效果可以和PhotoShop得鋭化虑镜相比,但灰度突变得边沿区域会变得非常突出,几乎成了边沿提取。在我得图像中,舞台上得幕布是鋭化得最自然得,而舞台上得汽车边沿边框过于突出,边沿线成为鲜艳颜色的线条。 
|