python图像处理基础
pip install pillow
安装PIL库
1.读取图片
from PIL import Image
import numpy as np
#打开图片
img = Image.open("../material/img2.jpg")
#打开图片并转为灰度图
img2 = Image.open("../material/img2.jpg").convert("L")
print(img2) #img和img2是一个PIL对象
print(np.array(img2)) #也可以通过numpy.array()转为数组
#显示图片
img.show()
img2.show()
2.图片缩放,裁剪和旋转
from PIL import Image
img = Image.open("../material/img2.jpg")
#获取图片宽高 (宽,高) 单位像素
w,h = img.size
#图片缩放
img2 = img.resize((int(w/2),int(h/2))) #传入的宽高要是整型的才行,浮点型会报错
img3 = img.resize((int(w*2),int(h*2)))
img2.show()
# img3.show()
img.save("小姐姐图片.jpg") #图片另存为
img2.save("小姐姐图片(缩略图).jpg")
from PIL import Image
img = Image.open("../material/img2.jpg")
#获取图片宽高 (宽,高) 单位像素
w,h = img.size
#图片裁剪
box = (150,350,400,600) #以(150,350)这个点作为左上角,(400,600)作为右上角
img2 = img.crop(box)
# img2.show()
#图片旋转
# img3 = img2.transpose(Image.ROTATE_90) #逆时针转90度
img3 = img2.rotate(90) #逆时针转90度
img3.show()
3.图片另存为
imgObj.save("文件名",quality=75, subsampling=0)
quality是保存图像质量的参数,默认是75,所以另存为的图片宽高没变,但是大小会缩小,大概之后几十K
如果想保证图像质量可以调到90~95之间
subsampling=0 也是保证图像的质量
将图片数据化
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open("../material/img2.jpg").convert("L")
#将图片转为numpy数组
img_arr = np.array(img)
print(img_arr[:50])
#图片的像素大小为(600.900), 其数组的shape为(900,600),一维有900个元素,二维600个
print(img_arr.shape) # 每一个值都在0~255之间,代表颜色rgb
fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.gray() #不使用颜色,下面描绘的图像会变成黑白轮廓,否则是有颜色的
ax1.contour(img_arr,origin="image") #描绘图像轮廓
plt.axis("equal")
#描绘直方图
ax2 = fig.add_subplot(122)
#将二维数组展开成一维,并绘制成128条柱体的直方图来显示数据的分布情况,这里显示的就是rgb的分布情况
ax2.hist(img_arr.flatten(),128) # 横轴数据是0~255,即img_arr中的数据值,纵轴是该条柱代表的数据出现的频数(次数),因为数据值是0~255,柱体数是128,所以,一条柱体代表2个数据值;如果使用density=1则纵轴显示的是频率;
plt.tight_layout() #设置默认间距,这样子图之间的距离会自动调节,不会出现坐标轴数据太长挡到另一个子图的情况
plt.show()
将图片数据化
使用opencv操作图片
安装opencv
pip install opencv-python -i /simple
-i 后面的表示使用国内镜像
1.读取和保存图片:
im = cv2.imread("文件名")
cv2.imwrite("文件名",im)
其中imread()返回的是一个numpy数组
在opencv中,图像不是按传统的RGB通道,而是按BGR顺序(RGB反序)存储的,读取图片时默认是BGR,可以通过cvtColor() 将颜色空间转换为灰度图或者RGB
转换代码如下:
cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2RGB
cv2.COLOR_GRAY2BGR
import cv2
im = cv2.imread(r"../material/img2.jpg")
print(im)
print(im.shape) #返回的是一个三维数组(900,600,3),其通道数是3
# 转为灰度图片,灰度图片的通道数是1,也就是一个二维数组
im2 = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
print(im2)
print(im2.shape)
2.使用matplotlib显示opencv的图片
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
im = cv2.imread(r"../material/img2.jpg")
gray_im = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
rgb_im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
plt.subplot(221)
plt.imshow(rgb_im) #作图,imshow() 接受的是一个numpy数组或者其他对象
plt.title("rgb图像(原图)")
plt.subplot(222)
plt.imshow(gray_im)
plt.title("灰度图像")
plt.subplot(223)
plt.imshow(im)
plt.title("bgr图像")
plt.tight_layout()
plt.show() #显示