OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果
本文為大家分享了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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++ Qt開(kāi)發(fā)之使用QTcpSocket實(shí)現(xiàn)TCP網(wǎng)絡(luò)通信
Qt 是一個(gè)跨平臺(tái)C++圖形界面開(kāi)發(fā)庫(kù),利用Qt可以快速開(kāi)發(fā)跨平臺(tái)窗體應(yīng)用程序,本文主要為大家介紹了如何運(yùn)用QTcpSocket組件實(shí)現(xiàn)基于TCP的網(wǎng)絡(luò)通信功能,需要的可以參考下2024-03-03
Qt開(kāi)發(fā)之使用socket實(shí)現(xiàn)遠(yuǎn)程控制
本篇文章將會(huì)介紹下位機(jī)通過(guò)心跳包和上位機(jī)之間進(jìn)行數(shù)據(jù)交互和遠(yuǎn)程功能控制的實(shí)現(xiàn)方法。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-11-11
解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄
在使用OpenCV的cv::VideoCapture讀取視頻文件時(shí),可能會(huì)遇到無(wú)法讀取特定格式,如MP4的視頻文件的問(wèn)題,本文介紹解決C++ openCV無(wú)法讀取視頻但是可以讀取圖像的問(wèn)題記錄,感興趣的朋友跟隨小編一起看看吧2024-09-09
實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法
下面小編就為大家?guī)?lái)一篇實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法。小編覺(jué)得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01

