基於Jupyter 完成實驗四: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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章