用C++写一个mfc的响应函数实现对图像进行3*3,5*5,3*5,7*5的中值滤波
时间: 2024-02-19 11:58:37 浏览: 54
图像c++中值滤波代码
4星 · 用户满意度95%
好的,以下是一个简单的示例代码:
```cpp
// 定义响应函数
void CMyDlg::OnMedianFilter()
{
// 读取图像
CImage image;
image.Load(_T("your_image_path"));
// 获取图像宽度和高度
int width = image.GetWidth();
int height = image.GetHeight();
// 分配内存
BYTE* pSrc = (BYTE*)image.GetBits();
BYTE* pDst = new BYTE[width * height];
// 中值滤波
int kernelSizes[4][2] = { {3, 3}, {5, 5}, {3, 5}, {7, 5} };
for (int k = 0; k < 4; k++) {
int kernelWidth = kernelSizes[k][0];
int kernelHeight = kernelSizes[k][1];
int kernelSize = kernelWidth * kernelHeight;
int* kernel = new int[kernelSize];
int halfKernelWidth = kernelWidth / 2;
int halfKernelHeight = kernelHeight / 2;
// 遍历图像像素
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int index = y * width + x;
int count = 0;
// 遍历 kernel
for (int j = -halfKernelHeight; j <= halfKernelHeight; j++) {
for (int i = -halfKernelWidth; i <= halfKernelWidth; i++) {
int newX = x + i;
int newY = y + j;
// 超出边界时使用边界像素值
if (newX < 0) newX = 0;
if (newX >= width) newX = width - 1;
if (newY < 0) newY = 0;
if (newY >= height) newY = height - 1;
// 获取 kernel 值
kernel[count++] = *(pSrc + newY * width + newX);
}
}
// 对 kernel 进行排序
std::sort(kernel, kernel + kernelSize);
// 取中间值作为当前像素值
*(pDst + index) = (BYTE)kernel[kernelSize / 2];
}
}
// 将结果写入图像
CString str;
str.Format(_T("result_%d.bmp"), k);
image.Create(width, height, 24);
memcpy(image.GetBits(), pDst, width * height);
image.Save(str);
// 释放内存
delete[] kernel;
}
delete[] pDst;
}
```
以上代码中,我们使用了四个不同的 kernel 尺寸进行了中值滤波,分别是 3x3, 5x5, 3x5 和 7x5。对于每个 kernel,我们遍历了图像中的每个像素,并以该像素为中心,取 kernel 内的像素值进行排序,然后取中间值作为当前像素的值。最后,我们将处理后的结果保存到了不同的文件中,以便进行对比和分析。
需要注意的是,以上代码仅为示例代码,实际使用时需要根据自己的需求进行修改和优化。
阅读全文