Python图像进行的变换(图像通道,裁剪)
1、将彩色图像转灰度图
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg')
gray=img.convert('L')
gray=np.array(gray, dtype='float32')
plt.imshow(gray,cmap='gray')
plt.axis('off')
plt.show()
原图像:
处理后的图像:
首先将图像转换为灰度,其次找出图像的通道RGB三通道,合并三通道,最终分别读取三通道
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg') #打开图像
gray=img.convert('L') #转换成灰度
gray=np.array(gray, dtype='float32')
r,g,b=img.split() #分离三通道
pic=Image.merge('RGB',(r,g,b)) #合并三通道
plt.subplot(2,3,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
plt.subplot(2,3,2), plt.title('gray')
plt.imshow(gray,cmap='gray'),plt.axis('off')
plt.subplot(2,3,3), plt.title('merge')
plt.imshow(pic),plt.axis('off')
r=np.array(r, dtype='float32')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'),plt.axis('off')
g=np.array(g, dtype='float32')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'),plt.axis('off')
b=np.array(b, dtype='float32')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'),plt.axis('off')
plt.show()
无cmap='gray’时
有cmap='gray’时为
2、裁剪图片
从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg') #打开图像
plt.subplot(1,2,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
box=(180,50,300,150)
x=img.crop(box)
plt.subplot(1,2,2), plt.title('x')
plt.imshow(roi)
plt.show()
3、几何变换
Image类有resize()、rotate()和transpose()方法进行几何变换。
1、图像的缩放和旋转
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg') #打开图像
a = img.resize((128, 128))
b = img.rotate(45) # 顺时针角度表示
plt.subplot(1,2,1), plt.title('resize')
plt.imshow(a)
plt.subplot(1,2,2), plt.title('rotate')
plt.imshow(b),plt.axis('off')
2、转换图像
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg') #打开图像
c = img.transpose(Image.FLIP_LEFT_RIGHT) #左右互换
d = img.transpose(Image.FLIP_TOP_BOTTOM) #上下互换
e = img.transpose(Image.ROTATE_90) #顺时针旋转
f = img.transpose(Image.ROTATE_180)
g = img.transpose(Image.ROTATE_270)
plt.subplot(2,3,1)
plt.imshow(c)
plt.subplot(2,3,2)
plt.imshow(d)
plt.subplot(2,3,3)
plt.imshow(e)
plt.subplot(2,3,4)
plt.imshow(f)
plt.subplot(2,3,5)
plt.imshow(g)
图片的打开与显示
from PIL import Image
img=Image.open('1.jpg')
img.show()
这种图片显示方式是调用操作系统自带的图片浏览器来打开图片,有些时候这种方式不太方便,因此我们也可以使用另上一种方式,让程序来绘制图片。
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')
plt.figure("dog")
plt.imshow(img)
plt.show()
这种方法虽然复杂了些,但推荐使用这种方法,它使用一个matplotlib的库来绘制图片进行显示。matplotlib是一个专业绘图的库,相当于matlab中的plot,可以设置多个figure,设置figure的标题,甚至可以使用subplot在一个figure中显示多张图片。matplotlib 可以直接安装
figure默认是带axis的,如果没有需要,我们可以关掉
plt.axis('off')
打开图片后,可以使用一些属性来查看图片信息,如
print (img.size) #图片的尺寸
print (img.mode) #图片的模式
print (img.format ) #图片的格式
(448, 448)
RGB
JPEG
图片的保存
img.save('2.png')
就一行代码,非常简单。这行代码不仅能保存图片,还是转换格式,如本例中,就由原来的jpg图片保存为了png图片。
将图像归一化至(-1,1)之间
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('1.jpg')
print (img.size)
out = img.resize((300, 300)) # 改变大小
min1 = np.min(out)
print(min1)
max1 = np.max(out)
print(max1)
range1 =max1 - min1
out2=(2*(out-min1)/range1)-1
plt.imshow(out)