您好,登錄后才能下訂單哦!
本文為大家分享了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)馬賽克效果,通過(guò)鼠標(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à)出的矩形框超出圖像范圍做處理,否則會(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)從右下往右上畫(huà)矩形框的情況做處理 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(); }
可以通過(guò)改變程序中neightbourHood參數(shù)的大小調(diào)整小矩形快的大小,實(shí)現(xiàn)效果:
二、毛玻璃效果
毛玻璃效果的實(shí)現(xiàn)通過(guò)用像素點(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í)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。