摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效。

本文分享自华为云社区《[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效》,作者: eastmount。

本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效。

一.图像量化处理

图像通常是自然界景物的客观反映,并以照片形式或视频记录的介质连续保存,获取图像的目标是从感知的数据中产生数字图像,因此需要把连续的图像数据离散化,转换为数字化图像,其工作主要包括两方面——量化和采样。数字化幅度值称为量化,数字化坐标值称为采样。本章主要讲解图像量化和采样处理的概念,并通过Python和OpenCV实现这些功能。

1.1 概述

所谓量化(Quantization),就是将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。图6-1是将图像的连续灰度值转换为0至255的灰度级的过程。

如果量化等级为2,则将使用两种灰度级表示原始图片的像素(0-255),灰度值小于128的取0,大于等于128的取128;如果量化等级为4,则将使用四种灰度级表示原始图片的像素,新图像将分层为四种颜色,0-64区间取0,64-128区间取64,128-192区间取128,192-255区间取192;依次类推。

图6-2是对比不同量化等级的“Lena”图。其中(a)的量化等级为256,(b)的量化等级为64,(c)的量化等级为16,(d)的量化等级为8,(e)的量化等级为4,(f)的量化等级为2。

1.2 操作

下面讲述Python图像量化处理相关代码操作。其核心流程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示。下述代码将灰度图像转换为两种量化等级。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#创建一幅图像
new_img = np.zeros((height, width, 3), np.uint8)
#图像量化操作 量化等级为2
for i in range(height):for j in range(width):for k in range(3): #对应BGR三分量if img[i, j][k] < 128:gray = 0else:gray = 128new_img[i, j][k] = np.uint8(gray)
#显示图像
cv2.imshow("src", img)
cv2.imshow("", new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

其输出结果如图6-3所示,它将灰度图像划分为两种量化等级。

下面的代码分别比较了量化等级为2、4、8的量化处理效果。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#创建一幅图像
new_img1 = np.zeros((height, width, 3), np.uint8)
new_img2 = np.zeros((height, width, 3), np.uint8)
new_img3 = np.zeros((height, width, 3), np.uint8)
#图像量化等级为2的量化处理
for i in range(height):for j in range(width):for k in range(3): #对应BGR三分量if img[i, j][k] < 128:gray = 0else:gray = 128new_img1[i, j][k] = np.uint8(gray)
#图像量化等级为4的量化处理
for i in range(height):for j in range(width):for k in range(3): #对应BGR三分量if img[i, j][k] < 64:gray = 0elif img[i, j][k] < 128:gray = 64elif img[i, j][k] < 192:gray = 128else:gray = 192new_img2[i, j][k] = np.uint8(gray)
#图像量化等级为8的量化处理
for i in range(height):for j in range(width):for k in range(3): #对应BGR三分量if img[i, j][k] < 32:gray = 0elif img[i, j][k] < 64:gray = 32elif img[i, j][k] < 96:gray = 64elif img[i, j][k] < 128:gray = 96elif img[i, j][k] < 160:gray = 128elif img[i, j][k] < 192:gray = 160elif img[i, j][k] < 224:gray = 192else:gray = 224new_img3[i, j][k] = np.uint8(gray)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles = [u'(a) 原始图像', u'(b) 量化-L2', u'(c) 量化-L4', u'(d) 量化-L8']
images = [img, new_img1, new_img2, new_img3]
for i in xrange(4): plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([])
plt.show()

输出结果如图6-4所示,该代码调用matplotlib.pyplot库绘制了四幅图像,其中(a)表示原始图像,(b)表示等级为2的量化处理,(c)表示等级为4的量化处理,(d)表示等级为8的量化处理。

1.3 K-Means聚类量化处理

上一小节的量化处理是通过遍历图像中的所有像素点,进行灰度图像的幅度值离散化处理。本小节补充一个基于K-Means聚类算法的量化处理过程,它能够将彩色图像RGB像素点进行颜色分割和颜色量化。更多知识推荐大家学习前一篇文章。

# coding: utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('people.png')
#图像二维像素转换为一维
data = img.reshape((-1,3))
data = np.float32(data)
#定义中心 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
#设置标签
flags = cv2.KMEANS_RANDOM_CENTERS
#K-Means聚类 聚集成4类
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)
#图像转换回uint8二维类型
centers = np.uint8(centers)
res = centers[labels.flatten()]
dst = res.reshape((img.shape))
#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles = [u'原始图像', u'聚类量化 K=4']
images = [img, dst]
for i in xrange(2): plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i]) plt.xticks([]),plt.yticks([])
plt.show()

输出结果如图6-4所示,它通过K-Means聚类算法将彩色人物图像的灰度聚集成四种颜色。

二.图像采样处理

2.1 概述

图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N个网格,每个网格用一个亮度值或灰度值来表示,其示意图如图6-5所示。

图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。图6-6展示了不同采样间隔的“Lena”图。

2.2 操作

下面讲述Python图像采样处理相关代码操作。其核心流程是建立一张临时图片,设置需要采样的区域大小(如16×16),接着循环遍历原始图像中所有像素点,采样区域内的像素点赋值相同(如左上角像素点的灰度值),最终实现图像采样处理。代码是进行16×16采样的过程。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('scenery.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#采样转换成16*16区域
numHeight = height/16
numwidth = width/16
#创建一幅图像
new_img = np.zeros((height, width, 3), np.uint8)
#图像循环采样16*16区域
for i in range(16):#获取Y坐标y = i*numHeightfor j in range(16):#获取X坐标x = j*numwidth#获取填充颜色 左上角像素点b = img[y, x][0]g = img[y, x][1]r = img[y, x][2]#循环设置小区域采样for n in range(numHeight):for m in range(numwidth):new_img[y+n, x+m][0] = np.uint8(b)new_img[y+n, x+m][1] = np.uint8(g)new_img[y+n, x+m][2] = np.uint8(r)
#显示图像
cv2.imshow("src", img)
cv2.imshow("", new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

同样,可以对彩色图像进行采样处理,下面的代码将彩色风景图像采样处理成8×8的马赛克区域。

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('scenery.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#采样转换成8*8区域
numHeight = height/8
numwidth = width/8
#创建一幅图像
new_img = np.zeros((height, width, 3), np.uint8)
#图像循环采样8*8区域
for i in range(8):#获取Y坐标y = i*numHeightfor j in range(8):#获取X坐标x = j*numwidth#获取填充颜色 左上角像素点b = img[y, x][0]g = img[y, x][1]r = img[y, x][2]#循环设置小区域采样for n in range(numHeight):for m in range(numwidth):new_img[y+n, x+m][0] = np.uint8(b)new_img[y+n, x+m][1] = np.uint8(g)new_img[y+n, x+m][2] = np.uint8(r)
#显示图像
cv2.imshow("src", img)
cv2.imshow("Sampling", new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

其输出结果如图所示,它将彩色风景图像采样成8×8的区域。

但上述代码存在一个问题,当图像的长度和宽度不能被采样区域整除时,输出图像的最右边和最下边的区域没有被采样处理。这里推荐读者做个求余运算,将不能整除部门的区域也进行采样处理。

2.3 局部马赛克处理

前面讲述的代码是对整幅图像进行采样处理,那么如何对图像的局部区域进行马赛克处理呢?下面的代码就实现了该功能。当鼠标按下时,它能够给鼠标拖动的区域打上马赛克,并按下“s”键保存图像至本地。

# -- coding:utf-8 --
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
im = cv2.imread('people.png', 1)
#设置鼠标左键开启
en = False
#鼠标事件
def draw(event, x, y, flags, param):global en#鼠标左键按下开启en值if event==cv2.EVENT_LBUTTONDOWN:en = True#鼠标左键按下并且移动
elif event==cv2.EVENT_MOUSEMOVE andflags==cv2.EVENT_LBUTTONDOWN:#调用函数打马赛克if en:drawMask(y,x)#鼠标左键弹起结束操作elif event==cv2.EVENT_LBUTTONUP:en = False
#图像局部采样操作
def drawMask(x, y, size=10):#size*size采样处理m = x / size * size  n = y / size * sizeprint m, n#10*10区域设置为同一像素值for i in range(size):for j in range(size):im[m+i][n+j] = im[m][n]
#打开对话框
cv2.namedWindow('image')
#调用draw函数设置鼠标操作
cv2.setMouseCallback('image', draw)
#循环处理
while(1):cv2.imshow('image', im)#按ESC键退出if cv2.waitKey(10)&0xFF==27:break#按s键保存图片elif cv2.waitKey(10)&0xFF==115:cv2.imwrite('sava.png', im)
#退出窗口
cv2.destroyAllWindows()

其输出结果如图所示,它将人物的脸部进行马赛克处理。

点击关注,第一时间了解华为云新鲜技术~

Python图像处理丨带你认识图像量化处理及局部马赛克特效相关推荐

  1. Python图像处理丨带你掌握图像几何变换

    摘要:本篇文章主要讲解图像仿射变换和图像透视变换,通过Python调用OpenCV函数实. 本文分享自华为云社区<[Python图像处理] 十二.图像几何变换之图像仿射变换.图像透视变换和图像校 ...

  2. 跟我学Python图像处理丨带你入门OpenGL

    摘要:介绍Python和OpenGL的入门知识,包括安装.语法.基本图形绘制等. 本文分享自华为云社区<[Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)>,作者:ea ...

  3. Python图像处理丨带你掌握傅里叶变换原理及实现(含图片见解)

    本文主要讲解图像傅里叶变换的相关内容,在数字图像处理中,有两个经典的变换被广泛应用--傅里叶变换和霍夫变换.其中,傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理 ...

  4. [Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 跟我学Python图像处理丨关于图像金字塔的图像向下取样和向上取样

    摘要:本文讲述图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 本文分享自华为云社区<[Python图像处理] 二十一.图像金字塔之图像向下取样和向上 ...

  6. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...

  7. Python图像处理丨图像的灰度线性变换

    摘要:本文主要讲解灰度线性变换. 本文分享自华为云社区<[Python图像处理] 十五.图像的灰度线性变换>,作者:eastmount. 一.图像灰度线性变换原理 图像的灰度线性变换是通过 ...

  8. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  9. Python图像处理丨详解图像去雾处理方法

    摘要:本文主要讲解ACE去雾算法.暗通道先验去雾算法以及雾化生成算法. 本文分享自华为云社区<[Python图像处理] 三十.图像预处理之图像去雾详解(ACE算法和暗通道先验去雾算法)丨[拜托了 ...

最新文章

  1. 乖离性暗机器人_《乖离性百万亚瑟王》国服超弩暗机器人平民通关攻略
  2. pandas使用groupby函数进行分组聚合、使用agg函数指定聚合统计计算的数值变量、并自定义统计计算结果的名称(naming columns after aggregation)
  3. scanf与gets的区分
  4. CSS position 属性
  5. 安全专家在硬盘固件中发现NSA的网络间谍程序
  6. 乔布斯在斯坦福大学演讲稿英文_西方大文豪最爱的10个英文单词,写尽人世间细腻情感!...
  7. Oracle —— 如何执行SQL文件
  8. Liferay 中Minifier Filter的minifyCss 奥秘窥探
  9. 基于vue axios element-ui 的 demo
  10. 《R语言数据挖掘:实用项目解析》——2.6 变量分段
  11. Concurrent and Parallel
  12. CLR via C#学习笔记-第十章-无参属性
  13. java 标题栏_如何更改java应用程序标题栏默认图标
  14. 技术研发团队管理计划方案书
  15. 若A、B为同阶矩阵且A、B均可逆,则AB亦可逆
  16. 【神经网络与深度学习】1.线性分类与感知机
  17. 数学老师必看,教您快速画椭圆
  18. JAVA 租车系统(包含Mysql数据库)
  19. 运维日记003--环境搭建与简单配置
  20. [安卓]安装低版本微信

热门文章

  1. SMT表面贴片加工流程
  2. 《OpenCV3编程入门-毛星云》第一部分 快速上手OpenCV
  3. Linux.3_gccg++编译
  4. 【英语专业,外企三年】我的完整学习和求职经历
  5. 分享好用无广告的手机浏览器,亲测值得下载
  6. 基于Arm-Linux和TCP/IP的远程控制嵌入式系统设计
  7. 王权富贵:pycharm安装第三方库
  8. Qt自定义控件--pagenavigation(页面导航)
  9. 基于ubuntu git操作-冲突处理
  10. java打印星型_使用java打印心型、圆形图案的实现代码