请问一下各位大哥:哪有有直方图的源代码,谢谢了
解决方案 »
- VS2008如何打开2010 的项目?
- 网络工程师 会不会很累(请CCNP,CCNA,或者CCIE进来做答)
- 如何实现多线程分块下载文件呀?
- 紧急求助:钩子中的参数
- vc 的SDK 编程,,突发奇想...猜测MFC 模式所写的一段SDK代码,,很短,,编译通不过.....
- vc编译器怎么了?
- 关于TRACE,显示的信息太长,出现断言失败,怎么办? 在线!
- 分数给的太少,如果能回答出我的问题,再给他500分又算什么呢?SDK的朋友请帮我.
- 发现一个好东西---Visual Assist,以后再也不用狂按Shift和Caps Lock了
- 在picture空间中如何获得不规则的区域,然后检测鼠标是否落在里面,例如ptinrect的功能
- 如何确定某点在某不规则区域中。
- 请推荐一个图像处理控件OCX,能实现任意角度旋转、直方图均衡、图像增强等功能
你也可以买一本人邮的Visual C++数字图象处理,上面有很多源代码的。
我发给你
不过是win32的
谢谢!!!
[email protected]
//求图象的灰度直方图,以对话框显示
//同时求出灰度、红、绿、兰四个通道的直方图数据
//数据为全局变量,其具体显示由类ZftDialog处理
{
// TODO: Add your command handler code here
long int data[256],rdata[256],gdata[256],bdata[256];
int i,j;
for(i=0;i<256;i++)
{
data[i]=0L;
rdata[i]=0L;
gdata[i]=0L;
bdata[i]=0L;
}
int width=m_mBmp.GetWidth();
int height=m_mBmp.GetHeight();
for(i=0;i<width;i++)
{
for(j=0;j<height;j++)
{
COLORREF color=m_mBmp.GetPixel(i,j);
int r=GetRValue(color);
int g=GetGValue(color);
int b=GetBValue(color);
float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
BYTE Gray=(BYTE)gray1;
data[Gray]++;
rdata[r]++;
gdata[g]++;
bdata[b]++;
}
}
long int total=0;
long int rtotal=0;
long int gtotal=0;
long int btotal=0;
for(i=0;i<256;i++)
{
if(data[i]>total)total=data[i];
if(rdata[i]>rtotal)rtotal=rdata[i];
if(gdata[i]>gtotal)gtotal=gdata[i];
if(bdata[i]>btotal)btotal=bdata[i];
}
for(i=0;i<256;i++)
{
CBmpDemoApp *app=(CBmpDemoApp *)AfxGetApp();
app->GrayData[i]=(float)data[i]/total;
app->RedData[i]=(float)rdata[i]/rtotal;
app->GreenData[i]=(float)gdata[i]/gtotal;
app->BlueData[i]=(float)bdata[i]/btotal;
}
}
//求图象的灰度直方图,以对话框显示
//同时求出灰度、红、绿、兰四个通道的直方图数据
//数据为全局变量,其具体显示由类ZftDialog处理
{
// TODO: Add your command handler code here
long int data[256],rdata[256],gdata[256],bdata[256];
int i,j;
for(i=0;i<256;i++)
{
data[i]=0L;
rdata[i]=0L;
gdata[i]=0L;
bdata[i]=0L;
}
int width=m_mBmp.GetWidth();
int height=m_mBmp.GetHeight();
for(i=0;i<width;i++)
{
for(j=0;j<height;j++)
{
COLORREF color=m_mBmp.GetPixel(i,j);
int r=GetRValue(color);
int g=GetGValue(color);
int b=GetBValue(color);
float gray1=float(r)*0.3f+(float)g*0.59f+(float)b*0.11f+0.5f;
BYTE Gray=(BYTE)gray1;
data[Gray]++;
rdata[r]++;
gdata[g]++;
bdata[b]++;
}
}
long int total=0;
long int rtotal=0;
long int gtotal=0;
long int btotal=0;
for(i=0;i<256;i++)
{
if(data[i]>total)total=data[i];
if(rdata[i]>rtotal)rtotal=rdata[i];
if(gdata[i]>gtotal)gtotal=gdata[i];
if(bdata[i]>btotal)btotal=bdata[i];
}
for(i=0;i<256;i++)
{
CBmpDemoApp *app=(CBmpDemoApp *)AfxGetApp();
app->GrayData[i]=(float)data[i]/total;
app->RedData[i]=(float)rdata[i]/rtotal;
app->GreenData[i]=(float)gdata[i]/gtotal;
app->BlueData[i]=(float)bdata[i]/btotal;
}
}
功能实现:
反色,灰度转换,对比度扩展,削波,阀值化http://www.vckbase.com/code/downcode.asp?id=349
自定义的图象类中的得到直方图函数,参数iClrChannel为rgb分量之一,piGrays为该分量的256灰度级。
void CImage::GetHistogram(int *piGrays, int iClrChannel)
{
if(m_hBmp == NULL) return;
for(int i = 0; i < 256; i++)
{
piGrays[i] = 0;
}
ASSERT(iClrChannel >= 0 && iClrChannel <= 3);
LPSTR lpBmp = (LPSTR)GlobalLock(m_hBmp);
BYTE* lpBmpBits = (BYTE*)GetBmpBits(lpBmp); CRect rcData = GetDataRect();
int row, col;
int iPixel=0;
BYTE r, g, b;
r = g = b = 0; switch(m_nBitCount)
{
case 24:
{
if(iClrChannel == 3/*luminary*/)
{
BYTE* pData = NULL;
for(row=rcData.top; row<rcData.bottom; row++)
{
for(col=rcData.left;col<rcData.right;col++)
{
pData = (BYTE*)lpBmpBits
+ row * m_nScanWidth + 3*col;
piGrays[(pData[0]+pData[1]+pData[2])/3]++;
}
}
}
else
{
for(row = rcData.top; row < rcData.bottom; row++)
{
iPixel = iClrChannel + row * m_nScanWidth
+ rcData.left*3;//origin pix of the row
for(col = rcData.left; col < rcData.right; col++)
{
piGrays[lpBmpBits[iPixel]]++;
iPixel += 3;
}
}
}
break;
}
case 8:
{
PALETTEENTRY PaletteColors[256];
if(m_pPalBmp->GetPaletteEntries(0, 256, PaletteColors)
!= 256 ) break;
for(row = rcData.top; row < rcData.bottom; row++)
{
iPixel = row * m_nScanWidth + rcData.left;
for(col = rcData.left; col < rcData.right; col++)
{
r = PaletteColors[lpBmpBits[iPixel]].peRed;
g = PaletteColors[lpBmpBits[iPixel]].peGreen;
b = PaletteColors[lpBmpBits[iPixel]].peBlue;
iPixel++;
switch(iClrChannel)
{
case 3:/*lum*/ piGrays[(r+g+b)/3]++;break;
case 2:/*red*/ piGrays[r]++;break;
case 1:/*green*/
piGrays[g]++;break;
case 0:/*blue*/ piGrays[b]++;break;
}
}
}
break;
}
}
GlobalUnlock(m_hBmp);
}m_hBmp为bmp图象中除去bmpfileheader后的数据,也就是PBMPINFOHEADER这个指针。用的HANDLE,所以需要先“GlobalLock”。
用这个函数得到:HANDLE WINAPI ReadBmpFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HANDLE hBMP;
LPSTR pBMP; //get length of Bmp in bytes for use when reading
dwBitsSize = file.GetLength(); //Go read the Bmp file header and check if it's valid.
file.SeekToBegin();
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
{
file.Close();
return NULL;
} if (bmfHeader.bfType != BMP_FILE_TYPE)
{
CString str1, str2;
str1.Format("此程序只能处理 BMP 图片!");
str2.Format("文件格式错误");
::MessageBox(NULL,str1,str2,MB_ICONERROR|MB_OK); file.Close();
return NULL;
}
//Allocate memory for Bmp
hBMP = (HANDLE) ::GlobalAlloc(GHND, dwBitsSize);
if (hBMP == 0)
{
file.Close();
return NULL;
}
pBMP = (LPSTR) ::GlobalLock((HGLOBAL) hBMP); // read the bits.
if (file.ReadHuge(pBMP, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
dwBitsSize - sizeof(BITMAPFILEHEADER) )
{
::GlobalUnlock((HGLOBAL) hBMP);
::GlobalFree((HGLOBAL) hBMP);
file.Close();
return NULL;
}
file.Close();
::GlobalUnlock((HGLOBAL) hBMP);
return hBMP;
}GetBmpBits函数用来得到图象数据。
LPSTR WINAPI GetBmpBits(LPSTR lpBmp)
{
return (lpBmp + *(LPDWORD)lpBmp + PaletteSize(lpBmp));
}对24位色图象来说,用上边的东东就可以得到灰度直方图。对8位(256)色图象来说,需要调色板的介入。
WORD WINAPI PaletteSize(LPSTR lpBmp)
{
// calculate the size required by the palette
if (IS_WIN30_BMP (lpBmp))
return (WORD)(::BmpNumColors(lpBmp) * sizeof(RGBQUAD));
else
return (WORD)(::BmpNumColors(lpBmp) * sizeof(RGBTRIPLE));
}WORD WINAPI BmpNumColors(LPSTR lpBmp)
{
WORD wBitCount; // Bmp bit count /* Calculate the number of colors in the color table based on
* the number of bits per pixel for the Bmp.
*/
if (IS_WIN30_BMP(lpBmp))
wBitCount = ((LPBITMAPINFOHEADER)lpBmp)->biBitCount;
else
wBitCount = ((LPBITMAPCOREHEADER)lpBmp)->bcBitCount; /* return number of colors based on bits per pixel */
switch (wBitCount)
{
case 1:
return 2; case 4:
return 16; case 8:
return 256; default:
return 0;
}
}得到调色板:
BOOL WINAPI CreateBmpPalette(HANDLE hBmp, CPalette* pPal)
{
LPLOGPALETTE lpPal; // pointer to a logical palette
HANDLE hLogPal; // handle to a logical palette
WORD wNumColors; // number of colors in color table
LPSTR lpBmp; // pointer to packed-Bmp
LPBITMAPINFO lpbmi; // pointer to BITMAPINFO structure (Win3.0)
LPBITMAPCOREINFO lpbmc; // pointer to BITMAPCOREINFO structure (OS/2)
BOOL bResult=FALSE; // return value //if handle to Bmp is invalid, return FALSE
if (hBmp == NULL)
return FALSE; lpBmp = (LPSTR) ::GlobalLock((HGLOBAL) hBmp); // get pointer to BITMAPINFO (Win 3.0)
lpbmi = (LPBITMAPINFO)lpBmp; // get pointer to BITMAPCOREINFO (OS/2)
lpbmc = (LPBITMAPCOREINFO)lpBmp; // get the number of colors in the Bmp
wNumColors = BmpNumColors(lpBmp); if(wNumColors ==0 ) //there is no palette in the bmp
return FALSE; // allocate memory block for logical palette
hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)
+ sizeof(PALETTEENTRY)
* wNumColors); // if three is not enough memory, clean up and return NULL
if (hLogPal == 0)
{
::GlobalUnlock((HGLOBAL) hBmp);
return FALSE;
} lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal); //set version and number of palette entries
lpPal->palVersion = PALVERSION;
lpPal->palNumEntries = (WORD)wNumColors; if (IS_WIN30_BMP(lpBmp)) // is this a Win 3.0 Bmp?
for (int i = 0; i < (int)wNumColors; i++)
{
lpPal->palPalEntry[i].peRed = lpbmi->bmiColors[i].rgbRed;
lpPal->palPalEntry[i].peGreen = lpbmi->bmiColors[i].rgbGreen;
lpPal->palPalEntry[i].peBlue = lpbmi->bmiColors[i].rgbBlue;
lpPal->palPalEntry[i].peFlags = 0;
}
else
for (int i = 0; i < (int)wNumColors; i++)
{
lpPal->palPalEntry[i].peRed = lpbmc->bmciColors[i].rgbtRed;
lpPal->palPalEntry[i].peGreen = lpbmc->bmciColors[i].rgbtGreen;
lpPal->palPalEntry[i].peBlue = lpbmc->bmciColors[i].rgbtBlue;
lpPal->palPalEntry[i].peFlags = 0;
} //create the palette and get handle to it
bResult = pPal->CreatePalette(lpPal);
::GlobalUnlock((HGLOBAL) hLogPal);
::GlobalFree((HGLOBAL) hLogPal); ::GlobalUnlock((HGLOBAL) hBmp); return bResult;
}