首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >灰度图像增强

灰度图像增强

作者头像
逍遥剑客
发布2018-05-21 15:09:17
1.2K0
发布2018-05-21 15:09:17
举报

1.

3x3

1/9

1/9

1/9

1/9

1/9

1/9

1/9

1/9

1/9

这个模板很明显,就是把当前像素的值用周围的像素值的平均值代替,产生模糊效果

// 模糊处理

void ImageProcess::BlurImage(CImage* srcImage,CImage* outImage, int blurType)

{

CWaitCursor WaitCursor;

//设置进度条范围

((CMainFrame*)AfxGetMainWnd())->SetProgressRange(0,srcImage->GetWidth());

for(int x = 0;x < srcImage->GetWidth();x++)

{

//设置当前进度

((CMainFrame*)AfxGetMainWnd())->SetProgressPos(x);

for(int y = 0;y < srcImage->GetHeight();y++)

{

int r = 0,g = 0,b = 0;

for(int col = -blurType;col <= blurType;col++)

{

for(int row = -blurType;row <= blurType;row++)

{

COLORREF pixel;

//防止越界

if( (x+row) < 0 ||(x+row) >= srcImage->GetWidth() ||

(y+col) < 0 || (y+col) >= srcImage->GetHeight())

pixel = srcImage->GetPixel(x,y);

else

pixel = srcImage->GetPixel(x + row,y + col);

r += GetRValue(pixel);

g += GetGValue(pixel);

b += GetBValue(pixel);

}

}

//取平均值

int blocks = (blurType*2 + 1)*(blurType*2 + 1);

r /= blocks;

g /= blocks;

b /= blocks;

//写回图像

outImage->SetPixelRGB(x,y,r,g,b);

}

}

}

同样,也有5x5,7x5等等的模板,模板越大,处理后的图像就越模糊

2.

0

-1

0

-1

4

-1

0

-1

0

这是另一种模板,是为了增强当前像素与周围像素的差别,产生的效果就是:锐化

此时的模板叫Laplacian模板,当然,这不是唯一的一种形式,例如:

-1 -2 -1

0 0 0

1 2 1

-1 0 1

-2 0 2

-1 0 1

是两种简化运算的近似效果,可以取得更快的处理速度

// 锐化图像

void ImageProcess::SharpImage(CImage* srcImage,CImage* outImage, int sharpType)

{

int Laplacian[3][9] =

{

{0,-1,0,-1,4,-1,0,-1,0},

{-1,-2,-1,0,0,0,1,2,1},

{-1,0,1,-2,0,2,-1,0,1}

};

CWaitCursor WaitCursor;

//设置进度条范围

((CMainFrame*)AfxGetMainWnd())->SetProgressRange(0,srcImage->GetWidth());

for(int x = 0;x < srcImage->GetWidth();x++)

{

//设置当前进度

((CMainFrame*)AfxGetMainWnd())->SetProgressPos(x);

for(int y = 0;y < srcImage->GetHeight();y++)

{

int r = 0,g = 0,b = 0,index = 0;;

for(int col = -1;col <= 1;col++)

{

for(int row = -1;row <= 1;row++)

{

COLORREF pixel;

//防止越界

if( (x+row) < 0 ||(x+row) >= srcImage->GetWidth() ||

(y+col) < 0 || (y+col) >= srcImage->GetHeight())

pixel = srcImage->GetPixel(x,y);

else

pixel = srcImage->GetPixel(x + row,y + col);

r += GetRValue(pixel) * Laplacian[sharpType][index];

g += GetGValue(pixel) * Laplacian[sharpType][index];

b += GetBValue(pixel) * Laplacian[sharpType][index];

index++;

}

}

//增强

COLORREF pixel = srcImage->GetPixel(x,y);

//r += GetRValue(pixel);

//g += GetGValue(pixel);

//b += GetBValue(pixel);

//处理颜色值溢出

r = (r > 255) ? 255 : r;

r = (r < 0) ? 0 : r;

g = (g > 255) ? 255 : g;

g = (g < 0) ? 0 : g;

b = (b > 255) ? 255 : b;

b = (b < 0) ? 0 : b;

//写回图像

outImage->SetPixelRGB(x,y,r,g,b);

}

}

}

3.基本的灰度变换

这应该是最简单的变换了,s=f(x,y),s为处理后的像素颜色值,而f(x,y)是什么函数,就决定了处理效果

如:

图像反转:s=L-1-r,常用于医学上的透视图的处理

对数变换:s=cLog(1+r),可以扩展被压缩的高值图像中的暗像素

幂次变换:s=cr^γ,这就是传说中的伽马校正!

代码示例,仅有对数变换,其它同理

// 对数变换

void ImageProcess::LogTransform(CImage* srcImage, CImage* outImage, int c)

{

CWaitCursor WaitCursor;

//设置进度条范围

((CMainFrame*)AfxGetMainWnd())->SetProgressRange(0,srcImage->GetWidth());

for(int x = 0;x < srcImage->GetWidth();x++)

{

//设置当前进度

((CMainFrame*)AfxGetMainWnd())->SetProgressPos(x);

for(int y = 0;y < srcImage->GetHeight();y++)

{

int r = 0,g = 0,b = 0;

COLORREF pixel = srcImage->GetPixel(x,y);

r = GetRValue(pixel);

g = GetGValue(pixel);

b = GetBValue(pixel);

r = (int)(c * log(1.0f + r));

g = (int)(c * log(1.0f + g));

b = (int)(c * log(1.0f + b));

//处理颜色值溢出

r = (r > 255) ? 255 : r;

r = (r < 0) ? 0 : r;

g = (g > 255) ? 255 : g;

g = (g < 0) ? 0 : g;

b = (b > 255) ? 255 : b;

b = (b < 0) ? 0 : b;

//写回图像

outImage->SetPixelRGB(x,y,r,g,b);

}

}

}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2007年04月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档