python读取图片文件名_python图像处理基础之PIL和opencv

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()

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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")

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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()

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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()

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

8.png​​​​​​​

将图片数据化

使用opencv操作图片

安装opencv

pip install opencv-python -i https://pypi.doubanio.com/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)

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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() #显示

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

9.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值