Python中图片采样处理的示例分析
这篇文章给大家分享的是有关Python中图片采样处理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一.图像采样处理原理
图像采样(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:Eastmountimport 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:Eastmountimport 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:Eastmountimport 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中图片采样处理的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!