首先是边缘检测,加上原图像是图像锐化。
图像处理
直方图均衡:
直方图均衡:把原始图的直方图变换为均匀分布的形式,增加像素灰度值的动态范围,提高图像对比度。
主要步骤:先统计各个像素占全部像素的比例,然后像素x的 直方图均衡后的像素值就是(x的比例+所有像素值比x小的比例)*255。实现图像均衡的结果。
实验结果:
原图像:
直方图均衡后的图像:
代码:(是在MFC上实现的,课程祖传模板)
void CDemoView::OnImagestretchingHistogramequalization()
{
// TODO: 在此添加命令处理程序代码
CDemoDoc *pDoc = GetDocument();
HDIB dib = pDoc->GetHDIB();
LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)dib);
int width = ::DIBWidth(lpDIB);
int height = ::DIBHeight(lpDIB);
LPBITMAPINFOHEADER phead = (LPBITMAPINFOHEADER)lpDIB;
int biBitCount = phead->biBitCount / 8;
if (biBitCount != 1)
{
::MessageBox(0, "ERROR!NOT GRAY LEVEL IMAGE!", NULL, MB_OK);
::GlobalUnlock(dib);
return;
}
int lineByte = (width * biBitCount + 3) / 4 * 4;
unsigned char *lpDIBBits = (unsigned char *)::FindDIBBits(lpDIB);
int palSize = ::PaletteSize((LPSTR)lpDIB); //调色板尺寸
HANDLE dibNew = ::GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + palSize + height * lineByte);
LPSTR lpDIBNew = (LPSTR) ::GlobalLock(dibNew);
::memcpy((unsigned char*)lpDIBNew, (unsigned char*)lpDIB, sizeof(BITMAPINFOHEADER) + palSize + height * lineByte);
unsigned char *lpDIBBitsNew = (unsigned char *)::FindDIBBits(lpDIBNew);
int max = 0;
int min = 255;
int data;
int i, j;
double pix[256];
for (i = 0;i < 256;++i) {
pix[i] = 0;
}
for (i = 0;i < height;i++) {
for (j = 0;j < width;j++) {
data = *(lpDIBBits + i * lineByte + j);
pix[data]++;
}
}
fo