Python图片处理之图片采样处理详解
作者:Eastmount 发布时间:2021-01-14 12:58:36
一.图像采样处理原理
图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N个网格,每个网格用一个亮度值或灰度值来表示,其示意图如图9-1所示。
图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。图9-2展示了不同采样间隔的“Lena”图,其中图(a)为原始图像,图(b)为128×128的图像采样效果,图©为64×64的图像采样效果,图(d)为32×32的图像采样效果,图(e)为16×16的图像采样效果,图(f)为8×8的图像采样效果[1-3]。
二.图像采样实现
下面讲述Python图像采样处理相关代码操作。其核心流程是建立一张临时图片,设置需要采样的区域大小(如16×16),接着循环遍历原始图像中所有像素点,采样区域内的像素点赋值相同(如左上角像素点的灰度值),最终实现图像采样处理。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena-hd.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#采样转换成16*16区域
numHeight = int(height/16)
numWidth = int(width/16)
#创建一幅图像
new_img = np.zeros((height, width, 3), np.uint8)
#图像循环采样16*16区域
for i in range(16):
#获取Y坐标
y = i*numHeight
for 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("Sampling", new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其输出结果如图9-3所示,它将灰度图像采样成16×16的区域。
同样,可以对彩色图像进行采样处理,下面的代码将“小珞珞”的图像采样处理成8×8的马赛克区域。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#采样转换成8×8区域
numHeight = int(height/8)
numwidth = int(width/8)
#创建一幅图像
new_img = np.zeros((height, width, 3), np.uint8)
#图像循环采样8*8区域
for i in range(8):
#获取Y坐标
y = i*numHeight
for 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()
其输出结果如图9-4所示,它将彩色图像采样成8×8的区域。
但上述代码存在一个问题,当图像的长度和宽度不能被采样区域整除时,输出图像的最右边和最下边的区域没有被采样处理。这里推荐读者做个求余运算,将不能整除部分的区域也进行相应的采样处理。
三.图像局部采样处理
前面讲述的代码是对整幅图像进行采样处理,那么如何对图像的局部区域进行马赛克处理呢?下面的代码就实现了该功能。当鼠标按下时,它能够给鼠标拖动的区域打上马赛克,并按下“s”键保存图像至本地。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
im = cv2.imread('luo.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 and flags==cv2.EVENT_LBUTTONDOWN:
#调用函数打马赛克
if en:
drawMask(y,x)
#鼠标左键弹起结束操作
elif event==cv2.EVENT_LBUTTONUP:
en = False
#图像局部采样操作
def drawMask(x, y, size=10):
#size*size采样处理
m = int(x / size * size)
n = int(y / size * size)
print(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()
其输出结果如图9-5所示,它将人物的脸部进行马赛克处理。
四.总结
本文主要讲解了图像的采样处理,从基本概念到操作,再到扩展进行全方位讲解,并且补充了局部马赛克采样处理案例。该部分的知识点能够将生活中的图像转换为数字图像,更好地为后续的图像处理提供帮助。
来源:https://blog.csdn.net/Eastmount/article/details/122812908


猜你喜欢
- 如下所示:import pandas as pd#如果需要的话,需将df中的date列转为datetimedf.date = pd.to_d
- 简介滚动条小部件用于向下滚顶其他小部件的内容,如列表框,文本和画布,但是,我们也可以为Entry小部件创建水平滚动条,常常被用于实现文本,画
- 需求背景公司前端使用 Highcharts 构建图表,图表的图例支持点击显示或隐藏相应的指标。现在有需求后端需要存储用户在前端点击后显示图表
- 看这篇文章前需要先了解一下以下几个问题~一、问题1.分区是什么分区:就是把一张表数据分块存储目的:提升索引的查询效率2.Mysql为什么要使
- 最近在做人脸识别清洗样本的工作,发现经过人脸对齐后存在部分图片十分模糊,所以用opencv滤了一下。原理就是使用了cv2.Laplacian
- 本文介绍 SQL Server 2000 企业版的新功能 - 索引视图。讲解索引视图并讨论一些提高性能的具体方案。什么是索引视图?许多年来,
- 近日,有朋友一直打听flash连结服务器相关的知识,搞得我忧心重重,重点是自己也忘记了,大部分Flash的相关开发都是两年前的事,而且fla
- 数据库相关错误的解决办法错误一:数据库连接池超过限制SqlAlchemy QueuePool limit overflow造成连接数超过数据
- 首先啊,在python中我们熟知的py文件就是一个模块,也就是换言之以py结尾的Python源代码文件都是一个模块我就简单概括一下了直接上代
- 本文实例讲述了php使用Cookie实现和用户会话的方法。分享给大家供大家参考。具体分析如下:PHP 包含了很多的函数,可以用来管理和记录用
- 前言还记得这个九九乘法表吗,这次课后相信你可以用代码给你的小弟弟妹妹们变出这份“葵花宝典”。循环如果要把循环翻译成机器语言,那他对应的可以是
- 目录一、代码分析二、完整代码写在最后想必写毕设的时候,大家都会遇到一个问题,那就是得在明评版的论文里面插入一个独创性声明。就因为这个事情,我
- 一、决策树原理决策树是用样本的属性作为结点,用属性的取值作为分支的树结构。 决策树的根结点是所有样本中信息量最大的属性。树的中间结点是该结点
- 这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中。为了简要起见,某些实现方面的细节被简化或
- 前言在做项目的时候一些配置文件都会写在settings配置文件中,今天在研究"州的先生"开源文档写作系统-MrDoc的时
- os模块中的fork方法可以创建一个子进程。相当于克隆了父进程os.fork()子进程运行时,os.fork方法会返回0; 而父进
- 只添加了一些自己想到的常用的功能,欢迎大家补充添加自己的好的思路. 通用的正则和方法可以写在RegExpObj中,
- Linux终端中的操作均是使用命令行来进行的。因此,对于小白来说,熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将pyth
- python中字典可以一键多值,也就是意味着一个键可以对应多个值。例:#encoding=utf-8print '中国'#字
- SQL 事件探查器数据列 SQL &