做的物流网站,平凉城乡建设局网站,做综合医院网站,模块建筑VC实现若干种图像滤波技术2 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 …VC实现若干种图像滤波技术2 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章 01- 一元熵值、二维熵值 02- 图像平移变换图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、K近邻均值滤波器 04-分段线性变换直方图均衡化、锐化处理 05-基于拉普拉斯算子、Canny的边缘检测功能、实现Otsu分割方法 06-最近邻插值双线性插值立方卷积插值 07-全局固定阈值分割、自适应阈值分割 文章目录 VC实现若干种图像滤波技术2实验要求一、K近邻中值滤波器KNNMF1. K近邻中值滤波器KNNMF原理2. K近邻中值滤波器KNNMF实验代码3. K近邻中值滤波器KNNMF实验现象 二、 最小均方差滤波器1. 最小均方差滤波器原理2. 最小均方差滤波器实验代码3. 最小均方差滤波器实验现象 彩色图像矢量中值滤波算法1. 矢量中值滤波算法原理2. 矢量中值滤波算法实验代码3. 矢量中值滤波算法实验现象 实验要求
B部分 1包括A部分全部要求。 2使用VC设计程序对一幅256级灰度图像分别使用K近邻中值滤波器KNNMF、最小均方差滤波器进行滤波。 3使用VC设计程序对一幅24位彩色图像使用矢量中值滤波算法进行滤波。
一、K近邻中值滤波器KNNMF
1. K近邻中值滤波器KNNMF原理
KNNMFK-Nearest Neighbors Mean Filter是一种非线性滤波算法它利用每个像素点周围的 K 个最近邻居的平均值进行图像平滑。与传统的平均滤波器不同KNNMF选择最相似的像素进行平均这有助于在滤波的同时更好地保留图像的细节。
以下是KNNMF的基本步骤 选择邻居数量K和滤波器大小 确定每个像素点周围邻居的数量 K同时选择一个滤波器的大小通常是一个 n × n n \times n n×n 的窗口其中 n n n为奇数。 遍历图像像素 对于图像中的每个像素以其为中心取一个 n × n n \times n n×n 的窗口。 计算邻居的相似度 计算窗口内每个像素与中心像素的相似度可以使用像素值之间的距离来衡量相似度。 选择相似度最高的 K 个邻居 选择相似度最高的 K 个邻居进行平均。 更新像素值 将该像素的值替换为相似度最高的 K 个邻居的平均值。
KNNMF算法相对于传统的平均滤波器更注重选择相似度高的邻居进行平均这有助于更好地保留图像的特征。在实际应用中相似度的计算可以采用不同的度量方式例如欧氏距离、余弦相似度等具体取决于图像的特点和应用场景。
2. K近邻中值滤波器KNNMF实验代码
void CImageProcessingView::OnEnhanceDenoiseKNNMF()
{// 实验 图像平滑 256级灰度图像 KNNMF滤波// 参考 CImageProcessingView::OnEnhanceDenoiseAverage()//MessageBox(请在这里设计 256级灰度图像 KNNMF滤波 算法);// 获得当前文档对象CImageProcessingDoc* pDoc GetDocument();if( pDoc-m_pDibInit-IsEmpty() ){MessageBox(图像未加载);return;}// 获得图像的基本信息int width pDoc-m_pDibInit-GetWidth();int height pDoc-m_pDibInit-GetHeight();int bitCount pDoc-m_pDibInit-GetBitCount();// 程序只支持处理灰度图像if( bitCount!8 ){MessageBox(目前只支持256级灰度图像);return;}// 将图像信息复制至 m_pDibTestpDoc-m_pDibTest-CloneDib(pDoc-m_pDibInit);//**********KNNMF滤波 算法**************//int i,j,m,n;BYTE grays[100];int graysSize 100;int templateWidth 3;int templateHeight 3;int templateElementCnt templateWidth*templateHeight;BYTE tempByte1;int kNN 3;for(itemplateWidth/2; ipDoc-m_pDibInit-m_lpBMIH-biWidth-templateWidth/2; i){for(jtemplateHeight/2; jpDoc-m_pDibInit-m_lpBMIH-biWidth-templateHeight/2; j){ memset(grays, 0, graysSize*sizeof(BYTE));for(n0; ntemplateHeight; n){for(m0; mtemplateWidth; m){ grays[n*templateWidthm] pDoc-m_pDibInit-GetPixelGray(i-templateWidth/2m, j-templateHeight/2n);}}BYTE centerGray pDoc-m_pDibInit-GetPixelGray(i, j);for(m0; mtemplateElementCnt-1; m){for(nm1; ntemplateElementCnt; n){if( abs(grays[m]-centerGray) abs(grays[n]-centerGray) ){tempByte1 grays[m];grays[m] grays[n];grays[n] tempByte1;}}}int midgray 0;//中值for (m 1; m kNN/2 ; m)midgray grays[m];pDoc-m_pDibTest-SetPixelGray(i, j, midgray);}}// 交换指针CDib* pTmpDib pDoc-m_pDibTest;pDoc-m_pDibTest pDoc-m_pDibInit;pDoc-m_pDibInit pTmpDib; // 设置脏标记pDoc-SetModifiedFlag(TRUE);// 更新视图pDoc-UpdateAllViews(NULL);
}3. K近邻中值滤波器KNNMF实验现象 二、 最小均方差滤波器
1. 最小均方差滤波器原理
最小均方差滤波是一种图像处理中常用的滤波方法其目标是通过在像素邻域内选择合适的权重使得滤波后的像素值与邻域内的像素值之间的均方差最小。
滤波过程中对于每个像素通过选取邻域内的像素进行加权平均其中每个像素的权重由该像素与中心像素之间的差异以及一个权重函数决定。权重函数通常是关于像素差异的一个单调递减函数以便更重视与中心像素相似的像素。
最小均方差滤波的目标函数可以表示为 E ( u , v ) ∑ i − N N ∑ j − N N w [ i , j ] ( I ( u i , v j ) − T ( u , v ) ) 2 E(u,v) \sum_{i-N}^{N} \sum_{j-N}^{N} w[i,j](I(ui,vj) - T(u,v))^2 E(u,v)i−N∑Nj−N∑Nw[i,j](I(ui,vj)−T(u,v))2
其中
$ (u,v) $ 是滤波后图像中的像素位置。$ (i,j) $ 是邻域内像素的偏移。$ I(ui,vj) $ 是邻域内某个像素的灰度值。$ T(u,v) $ 是中心像素的灰度值。$ w(i,j) $ 是权重函数。
最小均方差滤波的目标是找到使得目标函数 ( E(u,v) ) 最小的滤波器系数。这通常通过最小化目标函数的导数为零来实现。
具体实现最小均方差滤波需要对权重函数、邻域大小等进行合理的选择以适应不同的图像处理任务。
2. 最小均方差滤波器实验代码
//**********最小均方差滤波算法**************//
int templateWidth 3;
int templateHeight 3;for (int i templateWidth / 2; i width - templateWidth / 2; i)
{for (int j templateHeight / 2; j height - templateHeight / 2; j){double minMSE DBL_MAX; // 最小均方差初始化为最大值int optimalGray 0;// 尝试所有可能的灰度值for (int k 0; k 255; k){double mse 0.0;// 计算邻域内所有像素与当前灰度值的均方差for (int n 0; n templateHeight; n){for (int m 0; m templateWidth; m){BYTE pixelValue pDoc-m_pDibInit-GetPixelGray(i - templateWidth / 2 m, j - templateHeight / 2 n);mse pow(pixelValue - k, 2);}}mse / (templateWidth * templateHeight); // 均方差// 更新最小均方差和对应的灰度值if (mse minMSE){minMSE mse;optimalGray k;}}// 将最小均方差对应的灰度值设置为新的像素值pDoc-m_pDibTest-SetPixelGray(i, j, optimalGray);}
}3. 最小均方差滤波器实验现象
左加入噪声的图像 右进行滤波后的图像 彩色图像矢量中值滤波算法
1. 矢量中值滤波算法原理
矢量中值滤波算法是一种基于中值运算的图像平滑处理方法。其原理可以概括为以下几个步骤 选择邻域 对于图像中的每个像素定义一个邻域包含该像素及其周围的像素。邻域的大小由窗口大小确定。 构建邻域矩阵 将邻域内的像素值按某种顺序排列形成一个矢量。这个矢量包含了邻域内所有像素的灰度值。 中值运算 对构建的矢量进行中值运算即找到矢量中的中间值。这可以通过对矢量进行排序然后选择排序后的中间值来实现。 更新像素值 将中值作为原始像素的新值用于替代原始像素的灰度值。这样经过矢量中值滤波处理后图像中的每个像素都会得到一个中值平滑的结果。
矢量中值滤波的优点在于对图像进行平滑处理的同时能有效抑制噪声特别适用于去除图像中的椒盐噪声等离群点。这种滤波方法在一些图像处理任务中取得了较好的效果但也需要根据具体应用场景选择合适的窗口大小和滤波算法。
举个例子说明一下 假设我们有一个3x3的邻域矩阵其像素值如下 [ 10 20 15 30 25 40 35 15 20 ] \begin{bmatrix} 10 20 15 \\ 30 25 40 \\ 35 15 20 \\ \end{bmatrix} 103035202515154020
现在我们要进行矢量中值滤波按照步骤来进行处理 选择邻域 我们选择一个3x3的邻域以中心像素25为例。 构建邻域矩阵 将邻域内的像素值按顺序排列成矢量
$ \text{矢量} [10, 20, 15, 30, 25, 40, 35, 15, 20] $
中值运算 对矢量进行排序得到 $\text{矢量} [10, 15, 15, 20, 20, 25, 30, 35, 40] $
中值是排序后的中间值即 $\text{中值} 20 $。
更新像素值 将中值20作为原始像素25的新值。
这样经过矢量中值滤波处理后中心像素的值由原来的25变为20。这个过程对图像中的每个像素都进行以达到平滑图像的目的。这种方法在处理一些椒盐噪声等离群点时具有较好的效果。
2. 矢量中值滤波算法实验代码
//**********矢量中值滤波算法**************//int templateWidth 3;int templateHeight 3;int templateElementCnt templateWidth * templateHeight;int color_r[100][100] { 0 };int color_g[100][100] { 0 };int color_b[100][100] { 0 };for (int i templateWidth / 2; i pDoc-m_pDibInit-m_lpBMIH-biWidth - templateWidth / 2; i){for (int j templateHeight / 2; j pDoc-m_pDibInit-m_lpBMIH-biWidth - templateHeight / 2; j){// 获取当前像素点邻域的颜色信息for ( n 0; n templateHeight; n)for ( m 0; m templateWidth; m){RGBQUAD quad;quad pDoc-m_pDibInit-GetPixelColor(i - templateWidth / 2 m, j - templateHeight / 2 n);color_r[n][m] quad.rgbRed;color_g[n][m] quad.rgbGreen;color_b[n][m] quad.rgbBlue;}int sum_r 0, sum_g 0, sum_b 0;for ( n 0; n templateHeight; n)for ( m 0; m templateWidth; m){sum_r color_r[n][m];sum_g color_g[n][m];sum_b color_b[n][m];}int avl_r sum_r / templateElementCnt;int avl_g sum_g / templateElementCnt;int avl_b sum_b / templateElementCnt;float min 255; //最小的rRGBQUAD Quad;for ( n 0; n templateHeight; n)for ( m 0; m templateWidth; m){// 计算中值float temp (pow((color_r[n][m] - avl_r), 2) pow((color_g[n][m] - avl_g), 2) pow((color_b[n][m] - avl_b), 2)) / 2;if (temp min){Quad.rgbRed color_r[n][m];Quad.rgbGreen color_g[n][m];Quad.rgbBlue color_b[n][m];min temp;}}pDoc-m_pDibTest-SetPixelColor(i, j, Quad);}}3. 矢量中值滤波算法实验现象 左添加噪声的灰度图 右使用矢量中值滤波算法后