本文為大家分享了OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡的具體代碼,供大家參考,具體內(nèi)容如下
一、馬賽克效果
馬賽克的實(shí)現(xiàn)原理是把圖像上某個(gè)像素點(diǎn)一定范圍鄰域內(nèi)的所有點(diǎn)用鄰域內(nèi)隨機(jī)選取的一個(gè)像素點(diǎn)的顏色代替,這樣可以模糊細(xì)節(jié),但是可以保留大體的輪廓。
以下OpenCV程序?qū)崿F(xiàn)馬賽克效果,通過鼠標(biāo)左鍵在圖像上劃定馬賽克的矩形框。
#include <core/core.hpp> #include <highgui/highgui.hpp>  using namespace cv;  Mat imageSourceCopy; //原始圖像 Mat imageSource; //原始圖像拷貝 int neightbourHood = 9; //馬賽克上每個(gè)方框的像素大小  RNG rng; int randomNum; //鄰域內(nèi)隨機(jī)值  Point ptL; //左鍵按下時(shí)坐標(biāo) Point ptR; //右鍵按下時(shí)坐標(biāo)  //鼠標(biāo)回掉函數(shù) void onMouse(int event, int x, int y, int flag, void *ustg);  int main() {   imageSourceCopy = imread("Test.jpg");   imageSource = imageSourceCopy.clone();   //imshow("馬賽克", imageSourceCopy);   namedWindow("馬賽克");   setMouseCallback("馬賽克", onMouse);   waitKey(); }  void onMouse(int event, int x, int y, int flag, void *ustg) {   if (event == CV_EVENT_LBUTTONDOWN)   {     ptL = Point(x, y);   }   if (event == CV_EVENT_LBUTTONUP)   {     //對(duì)鼠標(biāo)畫出的矩形框超出圖像范圍做處理,否則會(huì)越界崩潰     x > imageSource.cols - 2 * neightbourHood ? x = imageSource.cols - 2 * neightbourHood : x = x;     y > imageSource.rows - 2 * neightbourHood ? y = imageSource.rows - 2 * neightbourHood : y = y;      //對(duì)鼠標(biāo)從右下往右上畫矩形框的情況做處理     ptR = Point(x, y);     Point pt = ptR;     ptR.x < ptL.x ? ptR = ptL, ptL = pt : ptR = ptR;     for (int i = 0; i < ptR.y - ptL.y; i += neightbourHood)     {       for (int j = 0; j < ptR.x - ptL.x; j += neightbourHood)       {         randomNum = rng.uniform(-neightbourHood / 2, neightbourHood / 2);         Rect rect = Rect(j + neightbourHood + ptL.x, i + neightbourHood + ptL.y, neightbourHood, neightbourHood);         Mat roi = imageSourceCopy(rect);         Scalar sca = Scalar(           imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[0],           imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[1],           imageSource.at<Vec3b>(i + randomNum + ptL.y, j + randomNum + ptL.x)[2]);         Mat roiCopy = Mat(rect.size(), CV_8UC3, sca);         roiCopy.copyTo(roi);       }     }   }   imshow("馬賽克", imageSourceCopy);   waitKey(); } 可以通過改變程序中neightbourHood參數(shù)的大小調(diào)整小矩形快的大小,實(shí)現(xiàn)效果:

二、毛玻璃效果
毛玻璃效果的實(shí)現(xiàn)通過用像素點(diǎn)鄰域內(nèi)隨機(jī)一個(gè)像素點(diǎn)的顏色替代當(dāng)前像素點(diǎn)的顏色實(shí)現(xiàn)。
#include <core/core.hpp> #include <highgui/highgui.hpp>  using namespace cv;  int main() {   Mat imageSource = imread("Test.jpg");   Mat imageResult = imageSource.clone();   RNG rng;   int randomNum;   int Number = 5;    for (int i = 0; i < imageSource.rows - Number; i++)     for (int j = 0; j < imageSource.cols - Number; j++)     {       randomNum = rng.uniform(0, Number);       imageResult.at<Vec3b>(i, j)[0] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[0];       imageResult.at<Vec3b>(i, j)[1] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[1];       imageResult.at<Vec3b>(i, j)[2] = imageSource.at<Vec3b>(i + randomNum, j + randomNum)[2];     }   imshow("毛玻璃效果", imageResult);   waitKey(); } 實(shí)現(xiàn)效果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選