C++图像锐化处理

guojingguan 2012-05-29 11:33:06
int width=m_bmInfoHeader.biWidth;
int height=m_bmInfoHeader.biHeight;
int nLineBytes=m_bmInfoHeader.biWidth*m_bmInfoHeader.biBitCount/8;
for (int i=0;i<height;i++)
{
for (int j=0;j<width;j++)//真彩色位图每个像素需要3个字节表示其颜色
{
int nRed1,nGreen1,nBlue1,nRed2,nGreen2,nBlue2;
BYTE *pTmpData=m_pBmpData+nLineBytes*i+j;
BYTE *pNextData=m_pBmpData+nLineBytes*(i+1)+j+3;
nRed1=pTmpData[2];
nGreen1=pTmpData[1];
nBlue1=pTmpData[0];
COLORREF color=RGB(nRed1,nGreen1,nBlue1);
nRed1=(color&0xFF);
nGreen1=(int)(color&62580)/256;
nBlue1=(int)(color&0xFF0000)/65536;
//获取下一个像素颜色
nRed2=pNextData[2];
nGreen2=pNextData[1];
nBlue2=pNextData[0];
COLORREF clNext=RGB(nRed2,nGreen2,nBlue2);
nRed2=(clNext&0xFF);
nGreen2=(int)(clNext&62580)/256;
nBlue2=(int)(clNext&0xFF0000)/65536;
nRed1+=(nRed1-nRed2)/2;
nGreen1+=(nGreen1-nGreen2)/2;
nBlue1+=(nBlue1-nBlue2)/2;
if(nRed1>255)
nRed1=255;
if(nRed1<0)
nRed1=0;

if(nGreen1>255)
nGreen1=255;
if(nGreen1<0)
nGreen1=0;

if(nBlue1>255)
nBlue1=255;
if(nBlue1<0)
nBlue1=0;
pTmpData[0]=nBlue1;
pTmpData[1]=nGreen1;
pTmpData[2]=nRed1;
}
这段代码是图像锐化处理,查了一些资料,没弄懂它是根据什么原理 来处理的 。曾经以为是普拉斯锐化,发现不太像 ,哪位高手帮忙掉点一二
...全文
518 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
神-气 2012-09-17
  • 打赏
  • 举报
回复
水平锐化吧,不过这个东西感觉也太简单了额,我感觉效果不怎么好。
anmychen2001 2012-05-31
  • 打赏
  • 举报
回复
nRed1+=(nRed1-nRed2)/2;
nGreen1+=(nGreen1-nGreen2)/2;
nBlue1+=(nBlue1-nBlue2)/2;
从这3行代码来看应该是在锐化,2个相近点的色差越大增量越大。
anmychen2001 2012-05-30
  • 打赏
  • 举报
回复
所谓锐化的原理就是使用样本统计(一般锐化时用的是方差,样本点为源点周围N*N区域,同心圆辐射出去),然后需要有一个阙值来控制,当方差大于阙值时认为该点为边界点需要锐化,则将其的颜色变的更深。
形象来说一团红色的中间有个蓝点,你会发现蓝点周围那圈的方差值会特别大。
guojingguan 2012-05-30
  • 打赏
  • 举报
回复
那也就是说边缘检测喽
但是这段代码我怎么感觉不太像啊

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧