均值滤波、中值滤波、混合中值滤波C++源码实例
生活随笔
收集整理的這篇文章主要介紹了
均值滤波、中值滤波、混合中值滤波C++源码实例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.均值濾波
? ? ? ??含義:把每個(gè)像素都用周圍的8個(gè)像素來做均值操作?。
均值濾波器有什么用處呢?
? ? ? 主要還是平滑圖像的用處, 有的圖像的銳度很高,用這樣的均值算法,可以把銳度降低。使得圖像看上去更加自然。(只能微弱的降低噪聲,不能剔除噪聲,對(duì)降噪幾乎沒用)
源碼:
#include "highgui.h" #include "cv.h" void MeanFilter(uchar* smooth, int width, int height) {int sum = height * width * sizeof(uchar);//圖像所占內(nèi)存容量 uchar *corrupted = (uchar*)malloc(sum);memcpy((char*)corrupted, (char*)smooth, sum);for (int j = 1; j<height - 1; j++){for (int i = 1; i<width - 1; i++){smooth[j*width + i] = (corrupted[(j - 1)*width + (i - 1)] + corrupted[(j - 1)*width + i] + corrupted[(j - 1)*width + (i + 1)] +corrupted[j*width + (i - 1)] + corrupted[j*width + i] + corrupted[j*width + (i + 1)] +corrupted[(j + 1)*width + (i - 1)] + corrupted[(j + 1)*width + i] + corrupted[(j + 1)*width + (i + 1)]) / 9;}} }void imgOperate(IplImage* image) {cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);cvShowImage("image-in", image);//將色彩圖像強(qiáng)制轉(zhuǎn)化為灰度圖像 IplImage* pGrayImg = NULL;IplImage* pImg = NULL;pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);pImg = cvCreateImage(cvGetSize(image), 8, 1);cvCvtColor(image, pGrayImg, CV_RGB2GRAY);//添加高斯噪聲 cvZero(pImg);CvRNG rng = cvRNG(-1); //初始化隨機(jī)數(shù)發(fā)生器 cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));cvAdd(pGrayImg, pImg, pImg);cvShowImage("image-access", pImg);MeanFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);cvShowImage("image-out", pImg);cvReleaseImage(&pGrayImg);cvWaitKey(0);cvDestroyWindow("image-in");cvDestroyWindow("image-out"); }int main() {IplImage* img = cvLoadImage("E:\\11.jpg");imgOperate(img);cvReleaseImage(&img);return 0; }
2.中值濾波
? ? ? ??均值濾波是像素周圍的3*3的像素做平均值操作, 那么中值就是在3*3中的像素中尋找中值。
? ? ? ? 可以清晰地看到, 這里的6,2,0,3,97,4,19,3,10這些像素最終都被中值4取代。
源碼:
#include "highgui.h" #include "cv.h" void MedianFilter(uchar* smooth, int width, int height) {int sum = height * width * sizeof(uchar);//圖像所占內(nèi)存容量 uchar *corrupted = (uchar*)malloc(sum);memcpy((char*)corrupted, (char*)smooth, sum);for (int j=1;j<height-1;j++) { for (int i=1;i<width-1;i++) { int k = 0; unsigned char window[9]; for (int jj = j - 1; jj < j + 2; ++jj) for (int ii = i - 1; ii < i + 2; ++ii) window[k++] = corrupted[jj * width + ii]; // Order elements (only half of them) for (int m = 0; m < 5; ++m) { int min = m; for (int n = m + 1; n < 9; ++n) if (window[n] < window[min]) min = n; // Put found minimum element in its place unsigned char temp = window[m]; window[m] = window[min]; window[min] = temp; } smooth[ j*width+i ] = window[4];//printf("%d\n", window[4]);} } }void imgOperate(IplImage* image) {cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);cvShowImage("image-in", image);//將色彩圖像強(qiáng)制轉(zhuǎn)化為灰度圖像 IplImage* pGrayImg = NULL;IplImage* pImg = NULL;pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);pImg = cvCreateImage(cvGetSize(image), 8, 1);cvCvtColor(image, pGrayImg, CV_RGB2GRAY);//添加高斯噪聲 cvZero(pImg);CvRNG rng = cvRNG(-1); //初始化隨機(jī)數(shù)發(fā)生器 cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));cvAdd(pGrayImg, pImg, pImg);cvShowImage("image-access", pImg);MedianFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);cvShowImage("image-out", pImg);cvReleaseImage(&pGrayImg);cvWaitKey(0);cvDestroyWindow("image-in");cvDestroyWindow("image-out"); }int main() {IplImage* img = cvLoadImage("E:\\11.jpg");imgOperate(img);cvReleaseImage(&img);return 0; }3.混合中值濾波器(Hybrid Median Filter)
? ? ? ? 首先當(dāng)前像素的上下左右和自身取中值 , 然后左上右上左下右下和自身取中值 , 完了前面的兩個(gè)值和當(dāng)前像素值再取一次中值 , 得到的值就是最后的終極像素值了。
#include "highgui.h" #include "cv.h" unsigned char median(unsigned char* elements, int width) {// Order elements (only half of them) for (int i = 0; i < (width >> 1) + 1; ++i){// Find position of minimum element int min = i;for (int j = i + 1; j < width; ++j)if (elements[j] < elements[min])min = j;// Put found minimum element in its place unsigned char temp = elements[i];elements[i] = elements[min];elements[min] = temp;}// Get result - the middle element return elements[width >> 1]; }void hybridMedianFilter(uchar* smooth, int width, int height) {int sum = height * width * sizeof(uchar);//圖像所占內(nèi)存容量 uchar *corrupted = (uchar*)malloc(sum);memcpy((char*)corrupted, (char*)smooth, sum);for (int j = 1; j<height - 1; j++){for (int i = 1; i<width - 1; i++){unsigned char window[5];unsigned char results[3];// Pick up cross-window elements window[0] = corrupted[(j - 1) * width + i];window[1] = corrupted[j * width + i - 1];window[2] = corrupted[j * width + i];window[3] = corrupted[j * width + i + 1];window[4] = corrupted[(j + 1) * width + i];// Get median results[0] = median(window, 5);// Pick up x-window elements window[0] = corrupted[(j - 1) * width + i - 1];window[1] = corrupted[(j - 1) * width + i + 1];window[2] = corrupted[j * width + i];window[3] = corrupted[(j + 1) * width + i - 1];window[4] = corrupted[(j + 1) * width + i + 1];// Get median results[1] = median(window, 5);// Pick up leading element results[2] = corrupted[j * width + i];// Get result smooth[j*width + i] = median(results, 3);}} }void imgOperate(IplImage* image) {cvNamedWindow("image-in", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-access", CV_WINDOW_AUTOSIZE);cvNamedWindow("image-out", CV_WINDOW_AUTOSIZE);cvShowImage("image-in", image);//將色彩圖像強(qiáng)制轉(zhuǎn)化為灰度圖像 IplImage* pGrayImg = NULL;IplImage* pImg = NULL;pGrayImg = cvCreateImage(cvGetSize(image), 8, 1);pImg = cvCreateImage(cvGetSize(image), 8, 1);cvCvtColor(image, pGrayImg, CV_RGB2GRAY);//添加高斯噪聲 cvZero(pImg);CvRNG rng = cvRNG(-1); //初始化隨機(jī)數(shù)發(fā)生器 cvRandArr(&rng, pImg, CV_RAND_NORMAL, cvScalarAll(0), cvScalarAll(15));cvAdd(pGrayImg, pImg, pImg);cvShowImage("image-access", pImg);hybridMedianFilter((unsigned char*)pImg->imageData, pImg->width, pImg->height);cvShowImage("image-out", pImg);cvReleaseImage(&pGrayImg);cvWaitKey(0);cvDestroyWindow("image-in");cvDestroyWindow("image-out"); }int main() {IplImage* img = cvLoadImage("E:\\11.jpg");imgOperate(img);cvReleaseImage(&img);return 0; }
總結(jié)
以上是生活随笔為你收集整理的均值滤波、中值滤波、混合中值滤波C++源码实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 民生银行账号只有9位
- 下一篇: 一维OTSU法、最小交叉熵法、二维OTS