Python圖像處理庫(Pillow教程)
1、Image類
from PIL import Image
im=Image.open("lena.png")
from __future__ import print_function
print(im.format, im.size, im.mode)
PNG (1081, 573) RGB
im.show()
2、圖片轉成jpg格式
from PIL import Image
def IsValidImage(img_path):
"""
判斷文件是否爲有效(完整)的圖片
:param img_path:圖片路徑
:return:True:有效 False:無效
"""
bValid = True
try:
Image.open(img_path).verify()
except:
bValid = False
return bValid
def transimg(img_path):
"""
轉換圖片格式
:param img_path:圖片路徑
:return: True:成功 False:失敗
"""
if IsValidImage(img_path):
try:
str = img_path.rsplit(".", 1)
output_img_path = str[0] + ".jpg"
print(output_img_path)
im = Image.open(img_path)
im.save(output_img_path)
return True
except:
return False
else:
return False
if __name__ == '__main__':
img_path = 'lena.png'
print(transimg(img_path))
lena.jpg
True
im = Image.open("lena.jpg")
im.show()
3、創建縮略圖
#導入包
from PIL import Image
import os
#獲取文件大小
def get_size(file):
# 獲取文件大小:KB
size = os.path.getsize(file)
return size / 1024
#拼接輸出文件地址
def get_outfile(infile, outfile):
if outfile:
return outfile
dir, suffix = os.path.splitext(infile)
outfile = '{}-out{}'.format(dir, suffix)
return outfile
#壓縮文件到指定大小
def compress_image(infile, outfile='', mb=128, step=10, quality=80):
"""不改變圖片尺寸壓縮到指定大小
:param infile: 壓縮源文件
:param outfile: 壓縮文件保存地址
:param mb: 壓縮目標,KB
:param step: 每次調整的壓縮比率
:param quality: 初始壓縮比率
:return: 壓縮文件地址,壓縮文件大小
"""
o_size = get_size(infile)
if o_size <= mb:
return infile
outfile = get_outfile(infile, outfile)
while o_size > mb:
im = Image.open(infile)
im.save(outfile, quality=quality)
if quality - step < 0:
break
quality -= step
o_size = get_size(outfile)
return outfile, get_size(outfile)
#修改圖片尺寸
def resize_image(infile, outfile='', x_s=240):
"""修改圖片尺寸
:param infile: 圖片源文件
:param outfile: 重設尺寸文件保存地址
:param x_s: 設置的寬度
:return:
"""
im = Image.open(infile)
x, y = im.size
y_s = int(y * x_s / x)
out = im.resize((x_s, y_s), Image.ANTIALIAS)
outfile = get_outfile(infile, outfile)
out.save(outfile)
if __name__ == '__main__':
compress_image(r"lena.png")
resize_image(r"lena.png")
左邊是原圖,右邊是縮放後的
4、確定圖片屬性
from __future__ import print_function
import sys
from PIL import Image
for infile in sys.argv[1:]:
try:
with Image.open(infile) as im:
print(infile, im.format, "%dx%d" % im.size, im.mode)
except IOError:
pass
im=Image.open("lena.png")
print(im.format, im.size, im.mode)
PNG (1081, 573) RGB
5、裁剪、粘貼、與合併圖片
#1)從圖片中複製子圖像
from PIL import Image
import matplotlib.pyplot as plt
im= Image.open("lena.png")
im= im.crop((200,200,500,500))
im.save("lena_crop.png")
im.show()
#2)處理子圖,粘貼回原圖
from PIL import Image
im1=Image.open("lena.png")
im2=Image.open("lena_crop.png")
im1.paste(im2,(200,200))
im1.save("lena_paste.png")
im1.show()
#3)分離和合並通道
#圖片分離
import numpy as np;
import cv2; #導入opencv模塊
image=cv2.imread("lena.png");#讀取要處理的圖片
B,G,R = cv2.split(image); #分離出圖片的B,R,G顏色通道
cv2.imshow("RED",R); #顯示三通道的值都爲R值時d圖片
cv2.imshow("GREEN",G); #顯示三通道的值都爲G值時d圖片
cv2.imshow("BLUE",B); #顯示三通道的值都爲B值時d圖片
cv2.waitKey(0); #不讓程序突然結束
#使用merge()函數將某一顏色通道(如R)與零矩陣合併,形成(R,0,0)從而顯示只有紅色通道的圖
import numpy as np;
import cv2; #導入opencv模塊
image=cv2.imread("lena.png");#讀取要處理的圖片
B,G,R = cv2.split(image); #分離出圖片的B,R,G顏色通道
zeros = np.zeros(image.shape[:2],dtype="uint8");#創建與image相同大小的零矩陣
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]));#顯示 (B,0,0)圖像
cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]));#顯示(0,G,0)圖像
cv2.imshow("RED",cv2.merge([zeros,zeros,R]));#顯示(0,0,R)圖像
cv2.waitKey(0);
#圖像合併
import numpy as np;
import cv2; #導入opencv模塊
image=cv2.imread("lena.png");#讀取要處理的圖片
B,G,R = cv2.split(image); #分離出圖片的B,R,G顏色通道
zeros = np.zeros(image.shape[:2],dtype="uint8");#創建與image相同大小的零矩陣
cv2.imshow("MERGE",cv2.merge([B,G,R]));
cv2.waitKey(0);
6、幾何變換
1)簡單幾何變換,順時針旋轉45°
from PIL import Image
im=Image.open("lena.png")
out = im.resize((128, 128))
out = im.rotate(45) # 順時針角度表示
out.show()
2)置換圖像
from PIL import Image
im=Image.open("lena.png")
out1 = im.transpose(Image.FLIP_LEFT_RIGHT)
out1.show()
out2 = im.transpose(Image.FLIP_TOP_BOTTOM)
out2.show()
out3 = im.transpose(Image.ROTATE_90)
out3.show()
out4 = im.transpose(Image.ROTATE_180)
out4.show()
out5 = im.transpose(Image.ROTATE_270)
out5.show()
3)模式轉換
from PIL import Image
im=Image.open("lena.png")
im = Image.open('lena.png').convert('L')
im.show()
7、圖像增強
1)Filter
from PIL import ImageFilter
im=Image.open("lena.png")
out = im.filter(ImageFilter.DETAIL)
im.show()
2)像素點處理
from PIL import ImageFilter
im=Image.open("lena.png")
# multiply each pixel by 1.5
out = im.point(lambda i: i * 1.5)
im.show()
3)高級圖片增強
from PIL import ImageEnhance
from PIL import ImageFilter
im=Image.open("lena.png")
enh = ImageEnhance.Contrast(im)
enh.enhance(1.3).show("30% more contrast")
8、更多讀取圖片方法(可選)
#draft讀取圖片
from __future__ import print_function
im = Image.open("lena.png")
print("original =", im.mode, im.size)
im.draft("L", (100, 100))
print("draft =", im.mode, im.size)
im.show()
original = RGB (1081, 573)
draft = RGB (1081, 573)