Python图像处理五:图像的几何运算和算术运算

图像的几何运算,主要用 skimage 的 transform 模块,函数比较多,功能齐全。

一、改变图像尺寸

resize 函数可以用来改变图像的尺寸。
函数格式为:

skimage.transform.resize(image,output_shape)

image: 需要改变尺寸的图像
output_shape: 新的图像尺寸

例 1:读入一幅数字图像,改变图像的尺寸,显示原图像及处理后的图像,代码:

from skimage import transform,data 
import matplotlib.pyplot as plt 
img=data.camera() 
dst=transform.resize(img,(80,60)) 
plt.figure('resize')

plt.subplot(121) 
plt.title('beforeresize') 
plt.imshow(img,plt.cm.gray)

plt.subplot(122) 
plt.title('afterresize') 
plt.imshow(dst,plt.cm.gray)

plt.show()

输出:
aaa

二、按比例缩放

rescale 函数可以对图像进行按比例缩放。
函数格式为:

skimage.transform.rescale(image,scale[,…])

scale 参数可以是单个 float 数,表示缩放的倍数,也可以是一个 float 型的 tuple,

如[0.2,0.5],表示将行、列数分开进行缩放。

例 2:读入一幅数字图像,通过设置不同的比例系数改变图像的尺寸,显示原图
像及处理后的图像,代码示例如下:

from skimage import transform,data,io 
import matplotlib.pyplot as plt 
img=data.camera()

plt.figure() 
io.imshow(img) 
print('原始图像尺寸',img.shape) #图像原始大小 plt.show()
img1=transform.rescale(img,0.1) #缩小为原来图像大小的 0.1 倍 
plt.figure() 

io.imshow(img1) 
print('img1 尺寸',img1.shape) 
plt.show()

img2=transform.rescale(img,[0.5,0.25])#缩小为原来图像行数一半,列数四分之一 
plt.figure() 
io.imshow(img2) 
print('img2 尺寸',img2.shape) 
plt.show()

img3=transform.rescale(img,[1,2]) #列数放大为原来图像大小的 2 倍 
plt.figure() 
io.imshow(img3) 
print('img3 尺寸',img3.shape) 
plt.show()

输出:
啊啊啊
暗搓搓错错

三、图像旋转

rotate 函数可以对图像进行旋转。
函数格式为

skimage.transform.rotate(image,angle[,…],resize=False)

angle 参数是个 float 类型数,表示旋转的度数
resize 用于控制在旋转时,是否改变大小 ,默认为 False

例 3:读入一幅数字图像,设置不同的旋转角度,改变图像的方向,显示原图像
及处理后的图像,代码示例如下:

from skimage import transform,data 
import matplotlib.pyplot as plt 
img=data.camera() 
print('原始图像尺寸',img.shape) #图像原始大小

img1=transform.rotate(img,60) #旋转 60 度,不改变大小 
print('img1 尺寸',img1.shape)

img2=transform.rotate(img,30,resize=True) #旋转 30 度,同时改变大小 
print('img2 尺寸',img2.shape)

plt.figure('resize',figsize=(20,20))

plt.subplot(121) 
plt.title('rotate60')
plt.imshow(img1,plt.cm.gray)

plt.subplot(122) 
plt.title('rotate30') 
plt.imshow(img2,plt.cm.gray)
plt.show()

输出:
accc

四、图像镜像

skimage 模块中没有提供直接对图像做镜像的函数,所以我们利用 numpy 中 的函数 fliplr 和 flipud 来实现对图像的镜像。
函数调用格式:

fliplr(img); 把输入图像 img 沿水平方向,左右反转
flipud(img); 把输入图像 img 沿垂直方向,上下反转

例 4:读入一幅数字图像,分别对图像做水平镜像、垂直镜像、对角镜像,显示
原图像及处理后的图像,代码示例如下:

from skimage import data,io 
from matplotlib.font_manager import FontProperties 
import matplotlib.pyplot as plt 
from numpy import fliplr,flipud

font_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=12) 
img=data.camera() 
img_plr=fliplr(img) 
img_pud=flipud(img) 
img_corner=fliplr(img_pud) 
plt.figure('img',figsize=(5,5)) 
plt.subplot(221) 
io.imshow(img)

plt.title('原始图像',fontproperties=font_set) 
plt.axis('off')

plt.subplot(222) 
io.imshow(img_plr) 
plt.title('水平镜像图像',fontproperties=font_set) 
plt.axis('off')

plt.subplot(223) 
io.imshow(img_pud) 
plt.title('垂直镜像图像',fontproperties=font_set) 
plt.axis('off')

plt.subplot(224) 
io.imshow(img_corner) 
plt.title('对角镜像图像',fontproperties=font_set) 
plt.axis('off')
plt.show()

输出:
暗搓搓错错

五、图像的加法和减法

图像进行加法和减法运算时,必须保证两幅图像的大小、数据类型和通道数 目相同。可以利用 numpy 数组的加法和减法运算,实现图像的加法和减法。 numpy数组的加法是一种模操作,对于灰度图像,在做加法运算时,若像素值的和超过 255,如 300,numpy 数组得到的是 300%256=44,表示取余数。在做减法运算时, 若结果小于 0,将相减以后的差除以 255 取余后加 1。

例 5:读入 2 幅数字图像,分别加法和减法运算,显示原图像及处理后的图像,
代码示例如下:

from matplotlib.font_manager import FontProperties
from skimage import data,io,transform 
from matplotlib import pyplot as plt

font_set=FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=12)

moon=data.moon() 
camera=data.camera()

image_minus=moon-camera 
image_plus=moon+camera 
plt.figure('imgADD',figsize=(8,8))

plt.subplot(2,2,1) 
plt.title('月亮图像',fontproperties=font_set) 
io.imshow(moon)

plt.subplot(2,2,2) 
plt.title('摄影师图像',fontproperties=font_set) 
io.imshow(camera)

plt.subplot(2,2,3) 
plt.title('月亮加摄影师图像',fontproperties=font_set) 
io.imshow(image_plus)

plt.subplot(2,2,4) 
plt.title('月亮减摄影师图像',fontproperties=font_set) 
io.imshow(image_minus)
plt.show()

输出:
AV板v

每日“大饼”:
没有不会做的事 只有不想做的事

猜你喜欢

转载自blog.csdn.net/weixin_52051554/article/details/127841697