做游戲還是做網(wǎng)站好百度seo怎么關(guān)閉
1、讀取圖像信息
查看圖像信息
讀取同一文件夾下的文件 可加 ./可不加
rom PIL import Image
img = Image.open('image.jpg') # 打開圖像文件(注意:是去掉文件頭的純數(shù)據(jù))
print(img.format) # 圖像格式(如BMP PNG JPEG 等)
print(img.size) # 圖像大小(寬,高) 注意 省略了通道 (w,h)
print(img.mode) # RGB 圖像顏色模式(L:灰度圖 RGB:真彩色 RGBA:添加了透明通道)
img.show() # 顯示圖像
運(yùn)行結(jié)果
linux里面png格式比較多,網(wǎng)絡(luò)傳輸里面壓縮格式 JPEG格式比較多,BMP無損格式
2、修改圖像顏色
PNG有透明通道,jpeg就沒有,不能變成 透明半透明;變成灰度圖 減少信息,只留輪廓,去掉顏色信息
RGB一個(gè)像素點(diǎn)的位數(shù)占24位,L一個(gè)像素點(diǎn)占8位
from PIL import Image
img = Image.open('image.jpg')
img = img.convert('L') #轉(zhuǎn)換為灰度黑白圖像 -> 只保留能識(shí)別輪廓的明暗對(duì)比,# 大幅減少了數(shù)據(jù)( 24位深 RGB 轉(zhuǎn)8位 L)
img.show()
3、圖像縮放
resize不會(huì)在原來的圖像上修改,改完之后 需要 有變量存儲(chǔ)
等比例放大縮小:等比例,注意需要是整數(shù),所以 需要強(qiáng)制類型轉(zhuǎn)換
from PIL import Image
img = Image.open('image.jpg')
print(img.size)
img = img.resize((32, 24),Image.ANTIALIAS) #修改圖像的寬高尺寸
print(img.size)
img.show()# 等比例縮放
img = img.resize(int(img.size[0]/4),int(img.size[1]/4))
print(img.size)
img.show()
4、圖像旋轉(zhuǎn) / 翻轉(zhuǎn)
圖像旋轉(zhuǎn)
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
img = img.rotate(90) #逆時(shí)針旋轉(zhuǎn)90度
img.show();
圖像翻轉(zhuǎn)
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
img = img.transpose(Image.FLIP_LEFT_RIGHT) #左右翻轉(zhuǎn)
img.show();
5、圖像轉(zhuǎn)numpy(數(shù)組)
圖像就是 一個(gè)矩陣,有很多像素點(diǎn),每個(gè)點(diǎn)表示顏色,8位圖 就有256種(0-255)表示顏色,色彩豐富 位數(shù)越多
一共3個(gè)維度,最后一維表示幾張圖疊加 RGB就是 紅綠藍(lán) RGBA再加一個(gè)透明半透明選項(xiàng)(255是不透明)
灰度圖就只有 高和寬,只有一個(gè)通道,是一個(gè) 二維的數(shù)組
/ 256 把值都整到0-1之間(到同一個(gè)量級(jí),不同的信息可以做相關(guān)的運(yùn)算) 歸一化
import numpy as np
from PIL import Image
img = Image.open('image.jpg')
obj= np.array(img) # 轉(zhuǎn)換圖像為 numpy
print(obj.shape) # 形狀: RGB三通道 每個(gè)通道為240行*320列矩陣 來表示本通道的灰度(明暗對(duì)比)
print(obj[0][1]) # 像素內(nèi)容: 0行1列的像素點(diǎn)對(duì)應(yīng)的R G B值img = img.convert('L') # 轉(zhuǎn)換為灰度黑白圖像 -> 只保留能識(shí)別輪廓的明暗對(duì)比,大幅減少了數(shù)據(jù)( 24位深 RGB 轉(zhuǎn)8位 L)
obj = np.asarray(img, dtype='float64')/256 # 轉(zhuǎn)換圖像為numpy ( 除以256是為了歸一化,# 使值都在0~1間,float64是指定數(shù)據(jù)類型保持精度)# array和asarray類似,只是array會(huì)copy該對(duì)象,而asarray 必要時(shí)才copy
print(obj.shape) # 形狀: 只保留了1通道的灰度
print(obj[0][1]) # 像素內(nèi)容:0行1列的像素點(diǎn)對(duì)應(yīng)的灰度值 (因前面除以了256 歸一化后為0~1間的數(shù))
運(yùn)行結(jié)果
6、查看圖像數(shù)據(jù)
{0:3d} 的意思是將第一個(gè)參數(shù)(索引為 0 的參數(shù))格式化為一個(gè)占據(jù) 3 個(gè)字符寬度的整數(shù),如果不足 3 個(gè)字符寬度則在左側(cè)填充空格
通過numpy可以查看圖片矩陣的數(shù)字
import numpy as np
from PIL import Image
img = Image.open('8.bmp')
img = img.convert('L') # 轉(zhuǎn)為灰度圖像(1像素 占8位)
obj= np.array(img) # 圖像轉(zhuǎn)為numpy
print(obj.shape) # (28 28) 圖像矩陣形狀為 28行 *28列# 輸出圖像數(shù)據(jù) -> 8字 的像素矩陣
for i in range(obj.shape[0]):for j in range(obj.shape[1]):print('{0:3d} '.format(obj[i][j]),end="") # i:圖像行號(hào) j:圖像列號(hào) 中間間隔“ ” print('E') # 每行末尾加一個(gè)E
7、轉(zhuǎn)為 指定格式的圖像存儲(chǔ)
把圖片改完之后不能直接存,先換成數(shù)組(去掉圖片信息),再變成圖像存儲(chǔ)(再加上圖片信息,就變成不同的格式)
第二種方式 pip install scipy
安裝對(duì)應(yīng)庫
# 方法一:
import numpy as np
from PIL import Imageimg = Image.open('1.png')
print(img.format,img.size,img.mode)img = img.convert('RGB')
img = img.resize((320, 240),Image.ANTIALIAS)obj= np.array(img)
img = Image.fromarray(obj)
img.save('1.jpg') # 把n維數(shù)組存為圖像(可根據(jù)后綴,自動(dòng)轉(zhuǎn)換為bmp png jpg等存儲(chǔ))img = Image.open('1.jpg')
print(img.format,img.size,img.mode)# 方法二:
import numpy as np
from PIL import Image
from scipy import misc
img = Image.open('8.bmp')
img = img.convert('L')
obj= np.array(img)
misc.imsave('8_8bit.png', obj) # 把n維數(shù)組存為圖像(可根據(jù)后綴,自動(dòng)轉(zhuǎn)換為bmp png jpg等存儲(chǔ))
8、圖像拼接
import os
from PIL import Image
import numpy as npdef mergePic(files):baseimg=Image.open(files[0])basemat=np.atleast_2d(baseimg) # 轉(zhuǎn)換圖像為 至少兩維的numpyfor file in files[1:]: # 遍歷除第一個(gè)外的numpyim=Image.open(file)mat=np.atleast_2d(im)basemat=np.append(basemat,mat,axis=1) # 橫向追加圖像(axis=0時(shí)為縱向)img=Image.fromarray(basemat)img.save('merge.png')path = "./pic/" # 注:該路徑下的圖像,必須是相同格式,尺寸的圖像
images = [] # 先存儲(chǔ)所有的圖像的名稱
for root, dirs, files in os.walk(path):for f in files :images.append(path+f)
print(images,len(images))mergePic(images)
basemat=np.append(basemat,mat,axis=1)
使用 NumPy 的 np.append() 函數(shù)將當(dāng)前遍歷到的圖片數(shù)組沿著橫軸(axis=1)方向追加到基礎(chǔ)圖像數(shù)組 basemat 后面,生成新的基礎(chǔ)圖像數(shù)組,并將其賦值給 basemat 變量。
img=Image.fromarray(basemat)
使用 PIL 庫的 Image.fromarray() 方法將 NumPy 數(shù)組 basemat 轉(zhuǎn)換為圖像對(duì)象,并將其賦值給 img 變量
images.append(path+f)
將每個(gè)文件的完整路徑添加到 images 列表中