帮我用c++和mfc写OSTU法实现阈值分割的函数BOOL WINAPI ThresholdTrans(LPSTR lpSrcStartBits, int lSrcWidth, int lSrcHeight, int bThre,int type)处理图片为8位
时间: 2023-12-29 16:03:36 浏览: 23
好的,以下是修改后的代码:
```c++
BOOL WINAPI ThresholdTrans(LPSTR lpSrcStartBits, int lSrcWidth, int lSrcHeight, int bThre, int type)
{
// 读取位图数据
BYTE* lpSrcBits = (BYTE*)lpSrcStartBits;
// 判断位图类型,如果不是24位真彩色位图则返回失败
if (type != 0x4d42 || lpSrcBits == NULL || lSrcWidth <= 0 || lSrcHeight <= 0)
{
return FALSE;
}
// 计算图像像素总数
int pixelCount = lSrcWidth * lSrcHeight;
// 将像素数据转换成灰度值
BYTE* grayData = new BYTE[pixelCount];
for (int i = 0; i < pixelCount; i++)
{
BYTE* pPixel = lpSrcBits + i * 3;
grayData[i] = (BYTE)(pPixel[0] * 0.299 + pPixel[1] * 0.587 + pPixel[2] * 0.114);
}
// 计算灰度级直方图
int histogram[256] = { 0 };
for (int i = 0; i < pixelCount; i++)
{
histogram[grayData[i]]++;
}
// 计算总灰度值
int totalGray = 0;
for (int i = 0; i < 256; i++)
{
totalGray += i * histogram[i];
}
// 计算总像素数
int totalPixels = pixelCount;
// 计算最大类间方差
double maxVariance = 0.0;
int threshold = 0;
int pixelCount0 = 0;
int pixelCount1 = 0;
double sumGray0 = 0.0;
double sumGray1 = 0.0;
for (int i = 0; i < 256; i++)
{
pixelCount0 += histogram[i];
if (pixelCount0 == 0)
{
continue;
}
pixelCount1 = totalPixels - pixelCount0;
if (pixelCount1 == 0)
{
break;
}
sumGray0 += i * histogram[i];
double meanGray0 = sumGray0 / pixelCount0;
double meanGray1 = (totalGray - sumGray0) / pixelCount1;
double variance = pixelCount0 * pixelCount1 * pow(meanGray0 - meanGray1, 2);
if (variance > maxVariance)
{
maxVariance = variance;
threshold = i;
}
}
// 应用阈值
for (int i = 0; i < pixelCount; i++)
{
if (grayData[i] < threshold)
{
grayData[i] = 0;
}
else
{
grayData[i] = 255;
}
}
// 复制灰度数据到位图数据
for (int i = 0; i < pixelCount; i++)
{
BYTE* pPixel = lpSrcBits + i * 3;
pPixel[0] = pPixel[1] = pPixel[2] = grayData[i];
}
// 释放内存
delete[] grayData;
// 返回成功
return TRUE;
}
```
这个函数的修改过程如下:
1. 读取位图数据,判断位图类型是否为24位真彩色位图,如果不是则返回失败。
2. 计算图像像素总数,将像素数据转换成灰度值,并将灰度值存储在一个新的灰度数据数组中。
3. 计算灰度级直方图,统计每个灰度级的像素数。
4. 计算总灰度值和总像素数,计算最大类间方差和阈值。
5. 应用阈值,将灰度值小于阈值的设为0,将灰度值大于等于阈值的设为255。
6. 复制灰度数据到位图数据中。
7. 释放内存。
8. 返回成功。
这个函数将图像处理为8位灰度图像,可以更方便地进行后续处理。希望能对你有所帮助!