那位高手可以帮助小女子,我将感激不尽。

解决方案 »

  1.   

    这是一本图像处理书上的源代码,你看有没用吧/*************************************************************************
     *
     * 函数名称:
     *   MedianFilter()
     *
     * 参数:
     *   HDIB hDIB          - 待处理的DIB
     *
     * 返回值:
     *   无返回值
     *
     * 说明:
     *   该函数将彩色位图进行中值滤波处理
     *
     ************************************************************************/void CSpaceFilter::MedianFilter(HDIB hDIB)
    {
    // 循环变量
    LONG i;
    LONG j;
    LONG k;
    LONG l; // 掩码模版
    unsigned char mask_r[9];
    unsigned char mask_g[9];
    unsigned char mask_b[9];
    COLORREF mask[9]; // 指向DIB的指针
    LPBYTE lpDIB;

    // 指向DIB象素指针
    LPBYTE lpDIBBits;

    // 锁定DIB
    lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB); // 找到DIB图像象素起始位置
    lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);

    // 判断是否是24-bpp位图
    if (m_clsDIB.DIBBitCount(lpDIB) != 24)
    {
    // 提示用户
    MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB);

    // 返回
    return;
    }

    // 更改光标形状
    BeginWaitCursor();

    // DIB的宽度
    LONG lWidth = m_clsDIB.DIBWidth(lpDIB);

    // DIB的高度
    LONG lHeight = m_clsDIB.DIBHeight(lpDIB); // 计算图像每行的字节数
    LONG lLineBytes = WIDTHBYTES(lWidth * 24); // 申请并分配中间缓存
    HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
    if (hLocal == NULL)
    return;
    LPBYTE m_temp = (LPBYTE)LocalLock(hLocal); // 复制图象数据到中间缓存
    for (i = 0; i < lHeight; i ++)
    {
    for (j = 0; j < lLineBytes; j ++)
    {
    *(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
    j++;
    *(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
    j++;
    *(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
    }
    } // 模版滤波
    for (i = 0; i < lWidth; i++) //被处理像素在i列
    {
    for (j = 0; j < lHeight; j++) //被处理像素在j行
    {
    // 索引
    int id = 0; // 进行小区域模版滤波
    for (k = i - 1; k < i + 2; k++)
    {
    for(l = j - 1; l < j + 2; l++)
    {
    // 防止内存溢出
    if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
    {
    mask_r[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
    mask_g[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
    mask_b[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);

    mask[id] = RGB(mask_r[id], mask_g[id], mask_b[id]);
    id++;
    }
    }
    }

    // 中间变量
    unsigned char T;

    // 冒泡排序法
    for (k = 0; k < 8; k++)
    {
    for (l = 8; l > k; l--)
    {
    if (mask_r[l] < mask_r[l - 1])
    {
    T = mask_r[l];
    mask_r[l] = mask_r[l - 1];
    mask_r[l - 1] = T;
    }
    if (mask_g[l] < mask_g[l - 1])
    {
    T = mask_g[l];
    mask_g[l] = mask_g[l - 1];
    mask_g[l - 1] = T;
    }
    if (mask_b[l] < mask_b[l - 1])
    {
    T = mask_b[l];
    mask_b[l] = mask_b[l - 1];
    mask_b[l - 1] = T;
    }
    }
    }
    m_temp[j * lLineBytes + i * 3] = mask_r[4];
    m_temp[j * lLineBytes + i * 3 + 1] = mask_g[4];
    m_temp[j * lLineBytes + i * 3 + 2] = mask_b[4];
    }
    } // 将转换后的中间缓存数据回存到DIB
    for (i = 0; i < lHeight; i ++)
    {
    for (j = 0; j < lLineBytes; j ++)
    {
    *((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
    j++;
    *((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
    j++;
    *((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
    }
    }

    // 解除锁定
    ::GlobalUnlock((HGLOBAL) hDIB);
    LocalUnlock(hLocal);
    LocalFree(hLocal); // 恢复光标
    EndWaitCursor();
    }