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

作者:Eastmount 时间:2021-01-14 12:58:36 

一.图像采样处理原理

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

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

图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大。图9-2展示了不同采样间隔的“Lena”图,其中图(a)为原始图像,图(b)为128×128的图像采样效果,图©为64×64的图像采样效果,图(d)为32×32的图像采样效果,图(e)为16×16的图像采样效果,图(f)为8×8的图像采样效果[1-3]。

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

二.图像采样实现

下面讲述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的区域。

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

同样,可以对彩 * 像进行采样处理,下面的代码将“小珞珞”的图像采样处理成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的区域。

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

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

三.图像局部采样处理

前面讲述的代码是对整幅图像进行采样处理,那么如何对图像的局部区域进行马赛克处理呢?下面的代码就实现了该功能。当鼠标按下时,它能够给鼠标拖动的区域打上马赛克,并按下“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图片处理之图片采样处理详解

四.总结

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

来源:https://blog.csdn.net/Eastmount/article/details/122812908

标签:Python,图片,采样
0
投稿

猜你喜欢

  • 如何获知服务器上Application对象及其对应的值?

    2009-11-24 18:09:00
  • django数据模型on_delete, db_constraint的使用详解

    2023-02-16 04:48:06
  • 基于Python实现英语单词小游戏

    2023-03-22 01:34:19
  • Python图片验证码降噪和8邻域降噪

    2023-09-16 10:05:49
  • 有啊在设计上相对淘宝的优势

    2009-05-22 12:28:00
  • Python import与from import使用及区别介绍

    2022-05-17 12:09:19
  • Python3 Tkinter选择路径功能的实现方法

    2022-03-12 19:39:28
  • python3代码中实现加法重载的实例

    2023-07-13 12:01:31
  • Python办公自动化PPT批量转换操作

    2023-11-07 16:54:20
  • 国外新闻报纸排版布局设计欣赏

    2008-02-25 23:14:00
  • 基于Tensorflow使用CPU而不用GPU问题的解决

    2022-01-01 22:53:08
  • 自动定时重启sql server回收内存

    2008-11-26 17:41:00
  • Python常用工具之音频调整音量

    2023-10-29 03:15:33
  • Python实现学生成绩管理系统

    2023-08-13 09:51:17
  • Python通过Pygame绘制移动的矩形实例代码

    2023-09-05 13:28:31
  • Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

    2022-12-02 02:20:42
  • CentOS 6.5中安装Python 3.6.2的方法步骤

    2022-10-11 09:13:43
  • 详解python ThreadPoolExecutor异常捕获

    2023-08-09 12:54:30
  • 对dataframe进行列相加,行相加的实例

    2023-07-24 16:57:59
  • python 将字符串中的数字相加求和的实现

    2022-11-03 22:31:08
  • asp之家 网络编程 m.aspxhome.com