如何用OpenCV实现图像的马赛克和毛玻璃滤镜效果?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1090个文字,预计阅读时间需要5分钟。
本文为家人分享如何用OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考。
一、马赛克效果
1.马赛克效果展示
2.马赛克的实现原理是将图像中的一部分像素用周围像素的平均值代替,从而达到马赛克的效果。
二、毛玻璃效果
1.毛玻璃效果展示
2.毛玻璃的实现原理是利用高斯模糊对图像进行处理,使图像产生模糊感,从而实现毛玻璃效果。
具体代码如下:
python
import cv2def apply_mosaic(image, block_size): 应用马赛克效果 :param image: 原始图像 :param block_size: 马赛克块的大小 :return: 处理后的图像 height, width, channels=image.shape result=np.zeros((height, width, channels), dtype=image.dtype)
for i in range(0, height, block_size): for j in range(0, width, block_size): block=image[i:i+block_size, j:j+block_size] avg=np.mean(block, axis=(0, 1)) result[i:i+block_size, j:j+block_size]=avg
return result
def apply_blur(image, kernel_size): 应用毛玻璃效果 :param image: 原始图像 :param kernel_size: 高斯模糊核大小 :return: 处理后的图像 return cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
加载图像image=cv2.imread(path_to_image.jpg)
应用马赛克效果mosaic_image=apply_mosaic(image, 10)
应用毛玻璃效果blur_image=apply_blur(image, 25)
显示结果cv2.imshow(Original Image, image)cv2.imshow(Mosaic Image, mosaic_image)cv2.imshow(Blur Image, blur_image)cv2.waitKey(0)cv2.destroyAllWindows()
注意:请将path_to_image.jpg替换为你的图像路径。
本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考,具体内容如下
一、马赛克效果
马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。
以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。
#include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; Mat imageSourceCopy; //原始图像 Mat imageSource; //原始图像拷贝 int neightbourHood = 9; //马赛克上每个方框的像素大小 RNG rng; int randomNum; //邻域内随机值 Point ptL; //左键按下时坐标 Point ptR; //右键按下时坐标 //鼠标回掉函数 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) { //对鼠标画出的矩形框超出图像范围做处理,否则会越界崩溃 x > imageSource.cols - 2 * neightbourHood ? x = imageSource.cols - 2 * neightbourHood : x = x; y > imageSource.rows - 2 * neightbourHood ? y = imageSource.rows - 2 * neightbourHood : y = y; //对鼠标从右下往右上画矩形框的情况做处理 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参数的大小调整小矩形快的大小,实现效果:
二、毛玻璃效果
毛玻璃效果的实现通过用像素点邻域内随机一个像素点的颜色替代当前像素点的颜色实现。
#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(); }
实现效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。
本文共计1090个文字,预计阅读时间需要5分钟。
本文为家人分享如何用OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考。
一、马赛克效果
1.马赛克效果展示
2.马赛克的实现原理是将图像中的一部分像素用周围像素的平均值代替,从而达到马赛克的效果。
二、毛玻璃效果
1.毛玻璃效果展示
2.毛玻璃的实现原理是利用高斯模糊对图像进行处理,使图像产生模糊感,从而实现毛玻璃效果。
具体代码如下:
python
import cv2def apply_mosaic(image, block_size): 应用马赛克效果 :param image: 原始图像 :param block_size: 马赛克块的大小 :return: 处理后的图像 height, width, channels=image.shape result=np.zeros((height, width, channels), dtype=image.dtype)
for i in range(0, height, block_size): for j in range(0, width, block_size): block=image[i:i+block_size, j:j+block_size] avg=np.mean(block, axis=(0, 1)) result[i:i+block_size, j:j+block_size]=avg
return result
def apply_blur(image, kernel_size): 应用毛玻璃效果 :param image: 原始图像 :param kernel_size: 高斯模糊核大小 :return: 处理后的图像 return cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)
加载图像image=cv2.imread(path_to_image.jpg)
应用马赛克效果mosaic_image=apply_mosaic(image, 10)
应用毛玻璃效果blur_image=apply_blur(image, 25)
显示结果cv2.imshow(Original Image, image)cv2.imshow(Mosaic Image, mosaic_image)cv2.imshow(Blur Image, blur_image)cv2.waitKey(0)cv2.destroyAllWindows()
注意:请将path_to_image.jpg替换为你的图像路径。
本文为大家分享了OpenCV实现马赛克和毛玻璃滤镜的具体代码,供大家参考,具体内容如下
一、马赛克效果
马赛克的实现原理是把图像上某个像素点一定范围邻域内的所有点用邻域内随机选取的一个像素点的颜色代替,这样可以模糊细节,但是可以保留大体的轮廓。
以下OpenCV程序实现马赛克效果,通过鼠标左键在图像上划定马赛克的矩形框。
#include <core\core.hpp> #include <highgui\highgui.hpp> using namespace cv; Mat imageSourceCopy; //原始图像 Mat imageSource; //原始图像拷贝 int neightbourHood = 9; //马赛克上每个方框的像素大小 RNG rng; int randomNum; //邻域内随机值 Point ptL; //左键按下时坐标 Point ptR; //右键按下时坐标 //鼠标回掉函数 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) { //对鼠标画出的矩形框超出图像范围做处理,否则会越界崩溃 x > imageSource.cols - 2 * neightbourHood ? x = imageSource.cols - 2 * neightbourHood : x = x; y > imageSource.rows - 2 * neightbourHood ? y = imageSource.rows - 2 * neightbourHood : y = y; //对鼠标从右下往右上画矩形框的情况做处理 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参数的大小调整小矩形快的大小,实现效果:
二、毛玻璃效果
毛玻璃效果的实现通过用像素点邻域内随机一个像素点的颜色替代当前像素点的颜色实现。
#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(); }
实现效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

