to: wjnana@sohu.com
from: @cpms.com.cn
title: 何东健主编《数字图像处理》程序的一点问题
(1)第四章 PointPro.cpp
BOOL CPointPro::MakeGray256(BYTE mGrayType, CDibObject *pDibObject )
......
switch( m_pDibObject->GetNumBits() )
......
case 16: //16位色真彩色图像
......
switch( mGrayType )
......
case 1:
......
//按亮度Y=R将彩色图像转换为灰度图像
dwGray = (ucRed * 30 + ucGreen * 59 +ucBlue * 11) / 100; //【error】
......
类似的还有 case 2: 和 case 3: 拷贝 case 0: 错了。
(3)第四章 PointPro.cpp
int *CPointPro::CreateHistogram( int nX1, int nY1, int nX2, int nY2,
unsigned char *pData, RGBQUAD *pPalette, int nWidthBytes, CDibObject *pDibObject )
......
switch( m_pDibObject->GetNumBits() )
{
case 1: //每像素位数为1,不处理
break;
case 4: //每像素位数为4,不处理
break;
case 8: //每像素位数为8
for( y = nY1; y <= nY2; y++ )
{
//数据指针定位到图像数据起始位置
pTemp = pData;
//数据指针定位到图像数据每行的起始零位置
pTemp += ( ( nHeight - 1 - y ) * nWidthBytes );
//数据指针定位到图像数据每行的起始nX1位置
pTemp += nX1; //【error】
for( x = nX1; x <= nX2; x++ )
{
//pTemp[x]为当前像素值,它为调色板项的索引值,
//以此为索引,取出调色板项的相应红绿蓝分量值。
ucRed = pPalette[pTemp[x]].rgbRed;
ucGreen = pPalette[pTemp[x]].rgbGreen;
......
case 8: 当 nX1 > 0 时,pTemp 定位就错位了。“pTemp += nX1;”此行应删除,或改“ucRed = pPalette[pTemp[x]].rgbRed;”为“ucRed = pPalette[pTemp[x - nX1]].rgbRed;”
case 24: 也是如此,错的更厉害一些了。
(4)第四章 PointPro.cpp
int CPointPro::FindThresh_Auto( CDibObject *pDibObject )