4.python-opencv图像马赛克

4.python-opencv图像马赛克

第一章 python-opencv-图片导入和显示
第二章 python-opencv图像简单处理
第三章 python-opencv图像mask掩膜处理


文章目录

  • 4.python-opencv图像马赛克
  • 完整代码
    • 方法一:通过尺寸改变实现马赛克
    • 方法二:通过像素重复实现马赛克
    • 方法三:间隔提取像素实现马赛克
  • 一、方法一说明
  • 二、方法二说明
    • 三、方法三说明
  • 总结
  • 代码运行效果
    • 方法一效果
    • 方法二效果
    • 方法三效果


完整代码

在这里使用三种方法实现图像马赛克的处理。

方法一:通过尺寸改变实现马赛克

import cv2

if __name__ == '__main__':
	# 加载图片
    picture = cv2.imread('lena.png')
    # 获取图片尺寸
    print(picture.shape)

    # 马赛克方法一:改变尺寸
    # 尺寸缩小
    img1 = cv2.resize(picture,(61, 55))
    # 尺寸放大
    img2 = cv2.resize(img1,(610, 553))
    cv2.imshow('picture', img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
   

方法二:通过像素重复实现马赛克

import cv2

if __name__ == '__main__':
	# 加载图片
    picture = cv2.imread('lena.png')	
	#马赛克方法二:
	# 图像尺寸缩小10倍
    img1 = cv2.resize(picture,(61, 55))
    # 在第一维度将每个像素重复10次
    img2 = np.repeat(img1, 10, axis=0) 
    # 在第二维度将每个像素重复10次
    img3 = np.repeat(img2, 10, axis=1) 
    cv2.imshow('picture', img3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

方法三:间隔提取像素实现马赛克

import cv2

if __name__ == '__main__':
	# 加载图片
    picture = cv2.imread('lena.png')	
	#马赛克方法三
	# #每隔10个像素取一个像素值
    img = picture[::10, ::10] 
    # 创建显示窗口 
    cv2.namedWindow('picture',flags=cv2.WINDOW_NORMAL)
    # 更改显示窗口的尺寸
    cv2.resizeWindow('picture',610, 553)
    cv2.imshow('picture', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

一、方法一说明

方法一的思想是现将图片尺寸缩小N倍,再将图片方法N倍,从而达到模糊图片的目的,其中所使用的函数为resize()函数,resize()函数的定义如下:

resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

调整大小(src,dsize[,dst[,fx[,fy[,插值]]]])-> dst
.函数 resize 将图像 src 的大小缩小到或最大到指定的大小。请注意,
.不考虑初始 dst 类型或大小。相反,大小和类型来自srcdsizefxfy
如果您想调整 src 的大小以使其适合预先创建的 dst,您可以按如下方式调用该函数:
.1.明确指定 dsize=dst.size(); fx 和 fy 将据此计算。
. resize(src, dst, dst.size(), 0, 0, 插值);
.2.如果要在每个方向将图像抽取 2 倍,可以调用函数 this
. 指定 fx 和 fy 并让函数计算目标图像大小。
.调整大小(src,dst,Size(),0.5,0.5,插值);
.3.要缩小图像,通常使用#INTER_AREA 插值看起来效果最好,而放大图像,通常使用 c#INTER_CUBIC (slow) 或 #INTER_LINEAR 效果最佳(更快,但看起来还可以)。
.
. @参数 src 输入图像。
. @参数 dst 输出图像;它的大小为 dsize (当它非零时)或计算的大小
. src.size()、fx 和 fy; dst 的类型与 src 的类型相同。
. @参数 dsize 输出图像大小;如果它等于 0(Python 中的“无”),则计算为:
.\f[\texttt{dsize = Size(round(fxsrc.cols), round(fysrc.rows))}\f]
. dsize 或 fx 和 fy 必须为非零。
. @参数 fx 沿水平轴的比例因子;当它等于 0 时,它被计算为
. \f[\texttt{(double)dsize.width/src.cols}\f]
. @参数 fy 沿垂直轴的比例因子;当它等于 0 时,它被计算为
. \f[\texttt{(double)dsize.height/src.rows}\f]
. @参数interpolation,见#InterpolationFlags

在python-opencv中的使用方法:

img = cv2.resize(picture,(61, 55))  #picture为要进行尺寸改变的图像,(61, 55)为改变后的尺寸大小

二、方法二说明

方法二的思想是先将图像缩小N倍,将每个像素冲符N次将图像变为与原始图像相同的尺寸,由于像素的重复从而达到图片模糊的效果,其中主要怕使用的函数为repeat()函数,repeat()函数的定义如下:

repeat(a, repeats, axis=None)

a:array_like
输入数组。
repeats:整数或整数数组
每个元素的重复次数。 repeats 被广播
以适应给定轴的形状。
axis:int,可选
沿其重复值的轴。 默认情况下,使用
扁平化的输入数组,并返回一个扁平的输出数组。

在python-opencv中的使用方法:

img1= np.repeat(img, 10, axis=0)  #将img图像在第一维度上将每个像素重复10次

三、方法三说明

方法三的思想是间隔提取图像的像素,从而将部分像素对其,从而实现图像模糊的效果,通过设置不同的间隔大小,可以改变图像的模糊程度。

通过切片操作实现间隔像素提取

img = picture[::10, ::10]   # 每隔10个像素值提取一次

创建显示窗口显示提取的图片

 cv2.namedWindow('picture',flags=cv2.WINDOW_NORMAL)

扩大显示窗口到原始图像大小

cv2.resizeWindow('picture',610, 553)

总结

本文主要讲了讲图片模糊达到图像马赛克的效果,主要使用了三种方法,方法一为将图片尺寸缩小N倍,再将图片方法N倍,从而达到模糊图片的目的;方法二为先将图像缩小N倍,将每个像素冲符N次将图像变为与原始图像相同的尺寸,由于像素的重复从而达到图片模糊的效果;方法三为间隔提取图像的像素,从而将部分像素对其,从而实现图像模糊的效果

代码运行效果

方法一效果

方法二效果

4.python-opencv图像马赛克_第1张图片

方法三效果

4.python-opencv图像马赛克_第2张图片

你可能感兴趣的:(python-opencv,opencv,python,计算机视觉)