python图像下采样,python中的图像处理

  python图像下采样,python中的图像处理

  本文将详细讲解图像采样处理,包括原理知识、代码实现和局部拼接处理。本文中的示例代码有详细的解释,有兴趣的人可以和边肖一起尝试一下。

  00-1010一、图像采样处理原理二。图像采样的实现。局部图像采样处理。摘要

  

目录

  图像采样处理是将一幅连续的图像在空间上分成MN个网格,每个网格用一个亮度值或一个灰度值来表示。示意图如图9-1所示。

  采样间隔越长,像素数量越少,空间分辨率越低,图像质量越差,甚至出现马赛克效果。相反,图像采样的间隔越小,像素越多,空间分辨率越高,图像质量越好,但数据量也会相应增加。图9-2显示了不同采样间隔的“Lena”图像,其中图(A)是原始图像,图(B)显示了128128的图像采样效果,图6464,图(D)显示了3232的图像采样效果,图(E)显示了1616的图像采样效果。

  

一.图像采样处理原理

  以下描述了与Python图像采样处理相关的代码操作。核心过程是创建一个临时图片,设置待采样区域的大小(例如1616),然后循环遍历原始图像中的所有像素,被采样区域的像素被赋予相同的值(例如左上角像素的灰度值),最终实现图像采样处理。

  # -*-编码: utf-8 -*-

  # By:伊斯特蒙特

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  #阅读原文图片

  img=cv2.imread(lena-hd.png )

  #获取图像的高度和宽度

  height=img.shape[0]

  width=img.shape[1]

  #样本被转换成16*16的区域

  numHeight=int(高度/16)

  numWidth=int(宽度/16)

  #创建图像

  new_img=np.zeros((高度,宽度,3),np.uint8)

  #图像循环采样16*16区域

  对于范围(16):内的I

  #获取y坐标

  y=i*numHeight

  对于范围(16):内的j

  #获取x坐标

  x=j*numWidth

  #获取填充颜色左上角的像素

  b=img[y,x][0]

  g=img[y,x][1]

  r=img[y,x][2]

  #循环设置小区域采样

  对于范围内的n(num height):

  对于范围内的m(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所示。它将灰度图像采样成1616的区域。

  类似地,可以对彩色图像进行采样。以下代码将“小罗罗”的图像采样到一个88的马赛克区域中。

  # -*-编码: utf-8 -*-

  # By:伊斯特蒙特

  导入cv2

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  #阅读原文图片

  img=cv2.imread(luo.png )

  #获取图像的高度和宽度

  height=img.shape[0]

  width=img.shape[1]

  #样本被转换成88的区域

  n

  umHeight = 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图片采样处理的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: