利用opencv实现图像马赛克处理的三种方法

前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理、示例、问题及问题的解决方案。

方法一

原理介绍:利用resize()将图片先缩小,再放大

代码示例:

import cv2
import numpy as np

if __name__ =='__main__':
    img=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\4.jpg')
    print(img.shape)#打印图片长宽
    cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小
    
    img2=cv2.resize(img,(49,35))
    img3=cv2.resize(img2,(490,350))
    
    cv2.imshow('image',img3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 

效果展示:利用opencv实现图像马赛克处理的三种方法_第1张图片

 

问题分析:使图像变的模糊,并没有达到马赛克的真正效果

解决方案:如果是想对图片进行马赛克处理,不太建议这种方法

方法二

原理介绍:1.先使用resize()将图片缩小按照一定比例缩小,原图像素为490*350,如下图代码示例cv2.resize(img,(49,35))即是将图像缩小十倍。

                  2.接着使用repeat(),分别将图像的横轴和竖轴放大N倍,(图中为10倍)

代码示例:

import cv2
import numpy as np

img=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\7.png')
cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小

img2=cv2.resize(img,(49,35))
img3=np.repeat(img2,10,axis=0) 
img4=np.repeat(img3,10,axis=1)

cv2.imshow("image",img3)
cv2.imwrite("image.png",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果展示:利用opencv实现图像马赛克处理的三种方法_第2张图片

问题分析:相较于方法一的图像简单模糊处理,方法二能够较好的实现图像的马赛克处理,在利用repeat()对图像进行横轴与数轴放大时,通过调整N的数值大小,也能够较好的实现马赛克程度的调整。

      此方式的问题在于,无法确定像素的选取,即无法确定是对某一块像素颜色进行加权处理,还是随机选取,或者采用其他方式。

解决方法:针对上述的问题,我所想到的解决方法是先对整个图像进行遍历,选取出一定像素颜色范围,对该范围利用上述方法进行处理。

方法三

原理介绍:利用切片,每隔n个取一个像素点,剥离了图像的细节

代码示例:

import cv2
import numpy as np

if __name__ =='__main__':
    img=cv2.imread('D:\\26059\\Desktop\\20220630_python_learning\\CSDN_opencv_learning\\4.jpg')
    print(img.shape)#打印图片长宽
    cv2.namedWindow("image",cv2.WINDOW_NORMAL)#自由改变显示框大小
    
    img2=img[::15,::15]
    
    cv2.imshow('image',img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果展示:利用opencv实现图像马赛克处理的三种方法_第3张图片

利用opencv实现图像马赛克处理的三种方法_第4张图片 

 

问题分析:上述图像中,图一的n值取15,图二的n值取50,通过对比,可以很明显的发现,图二的信息缺失更多,通过改变N值,也能够很好的实现图像马赛克程度的变化。

                  此种方法的问题在于,每n个像素取一个限制了像素选取的自由度。

你可能感兴趣的:(计算机视觉,python,计算机视觉,opencv,图像处理)