请教C++高手
//直方图均衡化voidCBmpShowView::OnImghisteq(){CBmpShowDoc*pDoc=GetDocument();ASSERT_VALID(p...
// 直方图均衡化
void CBmpShowView::OnImghisteq()
{
CBmpShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
ImgWidth = pDoc->nImgWidth;
ImgHeight = pDoc->nImgHeight;
LPBYTE lpDIBHdr;
LPBYTE lpDIBBits;
int i,j;
HPALETTE hOldPal = NULL;
HANDLE hDIB;
hDIB = pDoc->m_hDIB;
if(!hDIB)
return;
lpDIBHdr = (LPBYTE)GlobalLock(hDIB);
lpDIBBits = lpDIBHdr+sizeof(BITMAPINFOHEADER)+DIBNumColors(lpDIBHdr)*sizeof(RGBQUAD);
// 临时变量
long nTemp;
// 累积直方图,即灰度映射表
BYTE byMap[256];
// 直方图
int nCount[256];
// 重置计数为0
for (i = 0; i < 256; i ++)
{
// 清零
nCount[i] = 0;
}
// 计算各个灰度值的计数,即得到直方图
for (i = 0; i < ImgHeight; i ++)
{
for (j = 0; j < ImgWidth; j ++)
{
BYTE GrayValue = *(lpDIBBits+i*ImgWidth+j);
// 计数加1
nCount[GrayValue]++;
}
}
long ImgSize = ImgHeight*ImgWidth;
// 计算累积直方图
for (i = 0; i < 256; i++)
{
// 初始为0
nTemp = 0;
for (j = 0; j <= i ; j++)
{
nTemp += nCount[j];
}
// 计算对应的新灰度值
byMap[i] = (BYTE) (nTemp * 255/ImgSize);
}
for(i = 0; i < ImgHeight; i++)
{
// 每列
for(j = 0; j < ImgWidth; j++)
{
BYTE GrayValue = *(lpDIBBits+i*ImgWidth+j);
*(lpDIBBits+i*ImgWidth+j) = byMap[GrayValue];
}
}
pDoc->UpdateAllViews(NULL);
}
中前面一段:
// 直方图均衡化
void CBmpShowView::OnImghisteq()
{
CBmpShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
ImgWidth = pDoc->nImgWidth;
ImgHeight = pDoc->nImgHeight;
LPBYTE lpDIBHdr;
LPBYTE lpDIBBits;
int i,j;
HPALETTE hOldPal = NULL;
HANDLE hDIB;
hDIB = pDoc->m_hDIB;
if(!hDIB)
return;
什么意思????? 展开
void CBmpShowView::OnImghisteq()
{
CBmpShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
ImgWidth = pDoc->nImgWidth;
ImgHeight = pDoc->nImgHeight;
LPBYTE lpDIBHdr;
LPBYTE lpDIBBits;
int i,j;
HPALETTE hOldPal = NULL;
HANDLE hDIB;
hDIB = pDoc->m_hDIB;
if(!hDIB)
return;
lpDIBHdr = (LPBYTE)GlobalLock(hDIB);
lpDIBBits = lpDIBHdr+sizeof(BITMAPINFOHEADER)+DIBNumColors(lpDIBHdr)*sizeof(RGBQUAD);
// 临时变量
long nTemp;
// 累积直方图,即灰度映射表
BYTE byMap[256];
// 直方图
int nCount[256];
// 重置计数为0
for (i = 0; i < 256; i ++)
{
// 清零
nCount[i] = 0;
}
// 计算各个灰度值的计数,即得到直方图
for (i = 0; i < ImgHeight; i ++)
{
for (j = 0; j < ImgWidth; j ++)
{
BYTE GrayValue = *(lpDIBBits+i*ImgWidth+j);
// 计数加1
nCount[GrayValue]++;
}
}
long ImgSize = ImgHeight*ImgWidth;
// 计算累积直方图
for (i = 0; i < 256; i++)
{
// 初始为0
nTemp = 0;
for (j = 0; j <= i ; j++)
{
nTemp += nCount[j];
}
// 计算对应的新灰度值
byMap[i] = (BYTE) (nTemp * 255/ImgSize);
}
for(i = 0; i < ImgHeight; i++)
{
// 每列
for(j = 0; j < ImgWidth; j++)
{
BYTE GrayValue = *(lpDIBBits+i*ImgWidth+j);
*(lpDIBBits+i*ImgWidth+j) = byMap[GrayValue];
}
}
pDoc->UpdateAllViews(NULL);
}
中前面一段:
// 直方图均衡化
void CBmpShowView::OnImghisteq()
{
CBmpShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
ImgWidth = pDoc->nImgWidth;
ImgHeight = pDoc->nImgHeight;
LPBYTE lpDIBHdr;
LPBYTE lpDIBBits;
int i,j;
HPALETTE hOldPal = NULL;
HANDLE hDIB;
hDIB = pDoc->m_hDIB;
if(!hDIB)
return;
什么意思????? 展开
2个回答
展开全部
MFC编程中绘制直方图。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
char seg7[10]={0xc0,0xf9,0xa4,0xb0,0x9,0x92,0x82,0xf8,0x80} sbit w1=b2^0; sbit w2=b2^1; sbit k1=b3^0; /=1表示键盘按下 char cou...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
应该是简单的画图吧~~
老大啊!~这样学不了windows编程也学不会MFC,建议你看看《WINDOWS程序设计》或者《深入浅出MFC》,基本原理都不懂,拖一大堆或照搬一大堆代码是不可能理解的啊~~
老大啊!~这样学不了windows编程也学不会MFC,建议你看看《WINDOWS程序设计》或者《深入浅出MFC》,基本原理都不懂,拖一大堆或照搬一大堆代码是不可能理解的啊~~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询