Python图片处理之图片采样处理详解

 更新时间:2022年02月08日 08:56:01   作者:Eastmount  
这篇文章将详细为大家讲解图像采样处理,包括原理知识、代码实现和局部马赛克处理。文中的示例代码讲解详细,感兴趣的可以跟随小编一起动手试一试

一.图像采样处理原理

图像采样(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所示,它将人物的脸部进行马赛克处理。

四.总结

本文主要讲解了图像的采样处理,从基本概念到操作,再到扩展进行全方位讲解,并且补充了局部马赛克采样处理案例。该部分的知识点能够将生活中的图像转换为数字图像,更好地为后续的图像处理提供帮助。

以上就是Python图片处理之图片采样处理详解的详细内容,更多关于Python图片采样处理的资料请关注脚本之家其它相关文章!

相关文章

  • 在macOS上搭建python环境的实现方法

    在macOS上搭建python环境的实现方法

    今天小编就为大家分享一篇在macOS上搭建python环境的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python文本相似性计算之编辑距离详解

    Python文本相似性计算之编辑距离详解

    大家在做爬虫的时候,很容易保持一些相似的数据,这些相似的数据由于不完全一致,如果要通过人工一一的审核,将耗费大量的时间,大家对编辑距离应该有所了解,这篇文章我们先来了解下什么是编辑距离,然后在学习Python如何计算编辑距离,下面来一起学习学习吧。
    2016-11-11
  • 详解Python with/as使用说明

    详解Python with/as使用说明

    这篇文章主要介绍了Python with/as使用说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 利用python爬取斗鱼app中照片方法实例

    利用python爬取斗鱼app中照片方法实例

    最近在学习python,通过实践是学习的一个好办法,下面这篇文章就来给大家介绍了关于利用python爬取斗鱼app中照片的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。
    2017-12-12
  • python中数字列表转化为数字字符串的实例代码

    python中数字列表转化为数字字符串的实例代码

    先前学习过,数字和字符串都可以存储到变量当中,下面这篇文章主要给大家介绍了关于python中数字列表转化为数字字符串的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 解决Python安装后pip不能用的问题

    解决Python安装后pip不能用的问题

    今天小编就为大家分享一篇解决Python安装后pip不能用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python实现将字典内容保存到Excel文件的四种方法

    Python实现将字典内容保存到Excel文件的四种方法

    Python 中的字典是一个数据集合,其中每个值对应一个键,它们是无序的、可变的,并且对字典中存储的值和键的数据类型没有限制,本文给大家介绍了Python实现将字典内容保存到Excel文件的四种方法,需要的朋友可以参考下
    2024-07-07
  • pycharm执行python时,填写参数的方法

    pycharm执行python时,填写参数的方法

    今天小编就为大家分享一篇pycharm执行python时,填写参数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python实现获取弹幕的两种方式分享

    Python实现获取弹幕的两种方式分享

    弹幕可以给观众一种“实时互动”的错觉,在相同时刻发送的弹幕基本上也具有相同的主题,在参与评论时就会有与其他观众同时评论的错觉。本文为大家总结了两个Python获取弹幕的方法,希望对大家有所帮助
    2023-03-03
  • 用 Python 绘制全国鸿星尔克门店分布图

    用 Python 绘制全国鸿星尔克门店分布图

    这篇文章主要介绍了用 Python 绘制全国鸿星尔克门店分布图,今天就以某度地图 用Python爬虫看一下全国到底有多少家鸿星尔克门店,,需要的朋友可以参考一下
    2022-01-01

最新评论