图像各地快三平台架设搭建保边滤波算法集锦--局部均值滤波算法与实现

局部各地快三平台架设搭建【大神源码论坛】dsluntan.com 【布丁源码论坛】budingbbs.com 企娥3393756370均值滤波算法是基于均值改进的一种具有一定保边能力的滤波器,参考论文为Lee filter Digital image enhancement and noise filtering by using local statistics,具体算法如下:

本人C实现效果如下:

主要代码如下:

[cpp]  view plain  copy
 
  1.   
[cpp]  view plain  copy
 
  1. int LSNFilterOneChannel(unsigned char* srcData, int width ,int height, int radius, int delta)  
  2. {     
  3.     int len = sizeof(unsigned long) * width * height;  
  4.     unsigned char* dstData = (unsigned char*)malloc(len);  
  5.     unsigned long* meanData = (unsigned long*) malloc(len);  
  6.     unsigned long* covData = (unsigned long*) malloc(len);  
  7.     memset(meanData, 0, len);  
  8.     memset(covData, 0, len);  
  9.     MeanCovMapCalculate(srcData, width, height, width, meanData, covData, radius);  
  10.     float mean = 0, cov = 0, K = 0;  
  11.     int i, j, num = 2 * radius + 1;  
  12.     num = num * num;  
  13.     int gray = 0;  
  14.     for(j = 0; j < height; j++ )  
  15.     {  
  16.         for(i = 0; i < width; i++)  
  17.         {  
  18.             len = i + j * width;  
  19.             mean = (float)meanData[len];  
  20.             cov = (float)covData[len];  
  21.             cov = cov - mean * mean;  
  22.             K = cov / (cov + delta);  
  23.             gray = (int)((1.0 - K) * mean + K * (float)srcData[len]);  
  24.             dstData[len] = CLIP3(gray, 0, 255);  
  25.         }  
  26.     }  
  27.     memcpy(srcData, dstData, len);  
  28.     free(meanData);  
  29.     free(covData);  
  30.     free(dstData);  
  31.     return 0;  
  32. };  
  33. void f_LSNFilter(unsigned char* srcData, int nWidth, int nHeight, int nStride, int radius, int delta)  
  34. {  
  35.     if (srcData == NULL)  
  36.     {  
  37.         return;  
  38.     }  
  39.     unsigned char* rData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  40.     unsigned char* gData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  41.     unsigned char* bData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  42.     unsigned char* pSrc = srcData;  
  43.     unsigned char* pR = rData;  
  44.     unsigned char* pG = gData;  
  45.     unsigned char* pB = bData;  
  46.     for(int j = 0; j < nHeight; j++)  
  47.     {  
  48.         for(int i = 0; i < nWidth; i++)  
  49.         {  
  50.             *pR = pSrc[2];  
  51.             *pG = pSrc[1];  
  52.             *pB = pSrc[0];  
  53.             pR++;  
  54.             pG++;  
  55.             pB++;  
  56.             pSrc += 4;  
  57.         }  
  58.     }  
  59.     #pragma omp parallel sections  num_threads(omp_get_num_procs())  
  60.     {  
  61.         #pragma omp  section                      
  62.             LSNFilterOneChannel(rData, nWidth, nHeight, radius, delta);  
  63.         #pragma omp  section  
  64.             LSNFilterOneChannel(gData, nWidth, nHeight, radius, delta);  
  65.         #pragma omp  section  
  66.             LSNFilterOneChannel(bData, nWidth, nHeight, radius, delta);  
  67.     }  
  68.     pSrc = srcData;  
  69.     pR = rData;  
  70.     pG = gData;  
  71.     pB = bData;  
  72.     int R, G, B;  
  73.     for(int j = 0; j < nHeight; j++)  
  74.     {  
  75.         for(int i = 0; i < nWidth; i++)  
  76.         {  
  77.             pSrc[0] = *pB;  
  78.             pSrc[1] = *pG;  
  79.             pSrc[2] = *pR;  
  80.             pR++;  
  81.             pG++;  
  82.             pB++;  
  83.             pSrc += 4;  
  84.         }  
  85.     }  
  86.     free(rData);  
  87.     free(gData);  
  88.     free(bData);  
  89. }  
  90. void f_LSNFilterOneChannel(unsigned char* srcData, int nWidth, int nHeight, int nStride, int radius, int delta)  
  91. {  
  92.     if (srcData == NULL)  
  93.     {  
  94.         return;  
  95.     }  
  96.     unsigned char* yData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  97.     unsigned char* cbData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  98.     unsigned char* crData = (unsigned char*)malloc(sizeof(unsigned char) * nWidth * nHeight);  
  99.     unsigned char* pSrc = srcData;  
  100.     int Y, CB, CR;  
  101.     unsigned char* pY = yData;  
  102.     unsigned char* pCb = cbData;  
  103.     unsigned char* pCr = crData;  
  104.     for(int j = 0; j < nHeight; j++)  
  105.     {  
  106.         for(int i = 0; i < nWidth; i++)  
  107.         {  
  108.             RGBToYCbCr(pSrc[2],pSrc[1],pSrc[0],&Y,&CB,&CR);  
  109.             *pY = Y;  
  110.             *pCb = CB;  
  111.             *pCr = CR;  
  112.             pY++;  
  113.             pCb++;  
  114.             pCr++;  
  115.             pSrc += 4;  
  116.         }  
  117.     }  
  118.     LSNFilterOneChannel(yData, nWidth, nHeight, radius, delta);  
  119.     pSrc = srcData;  
  120.     pY = yData;  
  121.     pCb = cbData;  
  122.     pCr = crData;  
  123.     int R, G, B;  
  124.     for(int j = 0; j < nHeight; j++)  
  125.     {  
  126.         for(int i = 0; i < nWidth; i++)  
  127.         {  
  128.             YCbCrToRGB(*pY, *pCb, *pCr, &R, &G, &B);  
  129.             pSrc[0] = B;  
  130.             pSrc[1] = G;  
  131.             pSrc[2] = R;  
  132.             pY++;  
  133.             pCb++;  
  134.             pCr++;  
  135.             pSrc += 4;  
  136.         }  
  137.     }free(yData);free(cbData);free(crData);  
  138. }  

猜你喜欢

转载自www.cnblogs.com/LarryGary/p/9228897.html
今日推荐