主頁 > 知識庫 > Python一些基本的圖像操作和處理總結(jié)

Python一些基本的圖像操作和處理總結(jié)

熱門標簽:老人電話機器人 高德地圖標注是免費的嗎 洪澤縣地圖標注 大連crm外呼系統(tǒng) 梅州外呼業(yè)務系統(tǒng) 百度地圖標注位置怎么修改 北京電信外呼系統(tǒng)靠譜嗎 地圖標注視頻廣告 無錫客服外呼系統(tǒng)一般多少錢

一、Python圖像處理PIL庫

1.1 轉(zhuǎn)換圖像格式

# PIL(Python Imaging Library)
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']
# 讀取的是圖像,cv.imread讀取的是array,Image.open()顯示的圖像是RGB
pil_im=Image.open('pic/kobe_mamba.jpg')

subplot(121),plt.title('原圖'),axis('off')
imshow(pil_im)

pil_im_gray=pil_im.convert('L')
subplot(122),plt.title('灰度圖'),xticks(x,()),yticks(y,())
imshow(pil_im_gray)

# 轉(zhuǎn)換圖像格式 PIL中有九種不同模式。分別為1,L,P,RGB,RGBA,CMYK,YCbCr,I,F(xiàn)。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/apple.jpg')

# 模式1 二值圖像

pil_im_binary=pil_im.convert('1')
subplot(231),plt.title('二值圖像'),axis('off'),imshow(pil_im_binary)

pil_im_binary.getpixel((10,10))

# 模式2 L = R * 299/1000 + G * 587/1000+ B * 114/1000 灰度模式 0表示黑,255表示白

# 模式3 P模式為8位彩色圖像,通過RGB調(diào)色

pil_im_p=pil_im.convert('P')

subplot(232),plt.title('調(diào)色P圖像'),axis('off'),imshow(pil_im_p)

# 模式4 模式“RGBA”為32位彩色圖像,它的每個像素用32個bit表示,其中24bit表示紅色、綠色和藍色三個通道,另外8bit(255)表示alpha通道,255表示不透明。

pil_im_RGBA=pil_im.convert('RGBA')

subplot(233),plt.title('RGBA圖像'),axis('off'),imshow(pil_im_RGBA)

# 模式5 CMYK 三原色+黑色,每個像素由32位表示
# C = 255 - R, M = 255 - G, Y = 255 - B, K = 0

pil_im_CMYK=pil_im.convert('CMYK')

subplot(234),plt.title('CMYK圖像'),axis('off'),imshow(pil_im_CMYK)

#模式6 YCbcr 24位bit表示 Y= 0.257*R+0.504*G+0.098*B+16 Cb = -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128

pil_im_YCbCr=pil_im.convert('YCbCr')

subplot(235),plt.title('YCbCr圖像'),axis('off'),imshow(pil_im_YCbCr)

# 模式7 I模式略 與L模式顯示相同 ,只不過是32bit

# 模式8 F模式略 像素保留小數(shù),其余與L模式相同

1.2 縮略圖

# PIL(Python Imaging Library)
from PIL import Image
from pylab import *
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/kobe_mamba.jpg')


# 創(chuàng)建縮略圖 且可以指定大小

pil_im.thumbnail((120,120))

plt.title('縮略圖'),xticks(x,()),yticks([])
imshow(pil_im)

1.3 復制、粘貼和旋轉(zhuǎn)、調(diào)整尺寸

# 元組坐標分別為(左、上、右、下),從而標出了一塊區(qū)域,相當于[100:400,100:400]

box=(100,100,400,400)

region=pil_im.crop(box)
# 旋轉(zhuǎn)180度
region=region.transpose(Image.ROTATE_180)

figure(figsize=(5,5))

plt.title('復制區(qū)域'),axis('off')


imshow(region)
#粘貼


pil_im=Image.open('pic/kobe_mamba.jpg')

pil_im.paste(region,box)

figure(figsize=(5,5))

plt.title('粘貼后的圖像'),axis('off')

imshow(pil_im)

# 調(diào)整尺寸和旋轉(zhuǎn) resize 和 rotate 函數(shù)

out=pil_im.resize((128,128))

out=pil_im.rotate(45)

第二張圖是box旋轉(zhuǎn)了180度再粘貼的結(jié)果

二、Matoplotlib庫基礎(chǔ)學習

# 基本繪圖
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
from pylab import *

x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
figure()
plt.plot(x,z)
plt.show()

兩張繪圖


x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
plt.plot(x,y)
plt.plot(x,z)

繪圖疊加

# 曲線顏色、標記、粗細
plot(x, y, color="blue", linewidth=1.0, linestyle=":")
plot(x,z,'--r',linewidth=2.0)


# 離散取值
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'bo',markersize=3)

# 離散取值的屬性及用虛線相連
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w')

# 設(shè)置坐標軸的范圍和記號
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
xlim(-4,4)
xticks(np.linspace(-4,4,10))
ylim(-1.0,1.0)
yticks(np.linspace(-1.0,1.0,5))
plt.plot(x,y,'--r')

# 設(shè)置title與坐標軸的一些操作
# 設(shè)置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()
# 設(shè)置title與坐標軸的一些操作
# 設(shè)置中文
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()

#設(shè)置坐標軸的標簽(多樣化)
# xticks(locs, [labels], **kwargs)  # Set locations and labels **kwargs是關(guān)鍵字參數(shù)
import calendar

x = range(1,13,1)
y = range(1,13,1)
plt.plot(x,y)
# 標簽手動設(shè)置('','','',...)亦可
plt.xticks(x, calendar.month_name[1:13],color='m',rotation=45,fontsize=12,fontname='Arial')
plt.show()

# 設(shè)置圖例
matplotlib.rcParams['axes.unicode_minus'] =False

plt.rcParams['font.sans-serif'] = ['SimHei']
a=np.arange(13)*pi/12
b=cos(3*a)
plt.plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w',label='cos的圖像')
xlabel('橫軸')
ylabel('縱軸')
plt.legend(loc='upper right')
plt.show()

# 子圖1
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
fig, (ax1 ,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.plot(x,y),ax2.plot(x,z)
ax1.set_title('cos'),ax2.set_title('sin')
plt.show()

# 子圖2
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
figure(figsize=(10,5),dpi=80)
subplot(121),plt.plot(x,y),plt.title('cos')
subplot(122),plt.plot(x,z),plt.title('sin')
plt.show()

2.1 繪制實際圖像中的點和線

# 使用matplotlib連線
from PIL import Image
from pylab import *

# 讀取為列表,以便標記x、y的點?
im=array(Image.open('pic/kobe_mamba.jpg'))

imshow(im)

# 列表 包含四個點坐標
x=[100,100,400,400]
y=[200,500,200,500]

#紅色叉型標出
plot(x,y,'rx')


# 連接坐標的前兩個點的線 (100,200)與(100,500)
plot(x[:2],y[:2])

show()

2.2 圖像輪廓與直方圖

# contour 與 hist
# 繪制輪廓要將圖像先灰度化
from PIL import Image
from pylab import *

im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
figure()
# 
gray()
# 繪制輪廓,且起始位置從左上角開始
contour(im,origin='image')

# 坐標軸均勻分布
axis('equal')

# 新圖像
figure()
hist(im.ravel(),256)

# hist的第二個參數(shù)指定小區(qū)間的個數(shù),128個,即每個小區(qū)間灰度值跨度為2
figure()
hist(im.flatten(),128) 

show()

三、Numpy庫基本學習

import numpy as np

import math
a=np.array(((1,2,3),(4,5,6)),dtype=float/complex)
a


b=np.arange(15).reshape(3,5)
b
# 屬性
b.shape
b.ndim
b.dtype
b.size
b.itemsize

from numpy import pi
np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
c=np.random.random((2,3))

c.max/min()

d=np.arange(12).reshape((3,4))
d.dtype.name
# 每個col的sum
print(d.sum(axis=0))
# 每行的累計和
print(d.cumsum(axis=1))

# 轉(zhuǎn)變數(shù)組類型
a=np.array(((1,2,3),(4,5,6)),'float32')
a=a.astype('int16')
a

# 索引和切片
a = np.arange(10)**3 # 0~9的立方
a[2:5] #a[2-4]
# 令a[0,2,4]為-1000
a[:6:2] = -1000 
# reverse
a[ : :-1] 

a = np.arange(12).reshape((3,4))
a[0:3,1]
# 第2列
# or
a[:,1]
a[0:1,0:3]

# 變換為1維數(shù)組
a = np.arange(12).reshape((3,4))
a.ravel()

# 變換形狀
a = np.arange(12).reshape((3,4))
a.resize((6,2))
a

a = np.arange(12).reshape((3,4))
b=10*np.random.random((3,4))
# 豎著疊加
np.vstack((a,b))
# 橫著疊加
np.hstack((a,b))

x, y = np.ogrid[:3, :4]
# 同樣可以設(shè)置步長
x, y = np.ogrid[0:3:1, 0:5:2]

# 詢問,x>0的部分不變,其余賦值為2
np.where(x>0,x,2)

3.1 直方圖均衡化

# 解釋累加函數(shù)
import numpy as np
a=[1,2,3,4,5,6,7]
cdf=np.cumsum(a)

cdf[-1]

cdf=7*cdf/cdf[-1]
cdf

28

# 直方圖均衡化
# bins 小區(qū)間的個數(shù)
def histeq(im,bins=256):
    #返回兩個參數(shù)
    imhist,bins=histogram(im.flatten(),bins)
    # 累計分布函數(shù),相當于cdf是一個列表
    cdf=imhist.cumsum()
    # cdf[-1]是列表的最后一個值,(0,255)
    cdf=255*cdf/cdf[-1]
    # 新的線性插值
    im2=interp(im.flatten(),bins[:-1],cdf)
    # 返回im2圖像大小與im相同
    return im2.reshape(im.shape),cdf
# 直方圖先轉(zhuǎn)為灰度圖
im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
im2,cdf=histeq(im,256)

figure()
imshow(im2)
figure()
hist(im2.flatten(),256)
show()

3.2 圖像縮放

#  轉(zhuǎn)換為array
img = np.asarray(image)

# 轉(zhuǎn)換為Image
Image.fromarray(np.uint8(img))

# 圖像縮放函數(shù)

def imresize(im,sz):
    # 將數(shù)組轉(zhuǎn)換為圖像
    pil_im=Image.fromarray(np.uint8(im))
    # 圖像轉(zhuǎn)換為數(shù)組
    return np.array(pil_im.resize(sz))

imshow(imresize(Image.open('pic/kobe_mamba.jpg'),(128,128)))

3.3 圖像的主成分分析(PCA)

PCA(Principal Component Analysis,主成分分析)是一個非常有用的降維技巧。它可以在使用盡可能少維數(shù)的前提下,盡量多地保持訓練數(shù)據(jù)的信息,在此意義上是一個最佳技巧。即使是一幅 100×100 像素的小灰度圖像,也有 10 000 維,可以看成 10 000 維空間中的一個點。一兆像素的圖像具有百萬維。由于圖像具有很高的維數(shù),在許多計算機視覺應用中,我們經(jīng)常使用降維操作。PCA 產(chǎn)生的投影矩陣可以被視為將原始坐標變換到現(xiàn)有的坐標系,坐標系中的各個坐標按照重要性遞減排列。

為了對圖像數(shù)據(jù)進行 PCA 變換,圖像需要轉(zhuǎn)換成一維向量表示。我們可以使用 NumPy 類庫中的flatten() 方法進行變換。
將變平的圖像堆積起來,我們可以得到一個矩陣,矩陣的一行表示一幅圖像。在計算主方向之前,所有的行圖像按照平均圖像進行了中心化。我們通常使用 SVD(Singular Value Decomposition,奇異值分解)方法來計算主成分;但當矩陣的維數(shù)很大時,SVD 的計算非常慢,所以此時通常不使用 SVD 分解。

from PIL import Image
from numpy import *

def pca(X):
  """ 主成分分析:
    輸入:矩陣X ,其中該矩陣中存儲訓練數(shù)據(jù),每一行為一條訓練數(shù)據(jù)
    返回:投影矩陣(按照維度的重要性排序)、方差和均值"""

  # 獲取維數(shù)
    num_data,dim = X.shape

  # 數(shù)據(jù)中心化
    mean_X = X.mean(axis=0)
    X = X - mean_X

if dim>num_data:
  # PCA- 使用緊致技巧
  M = dot(X,X.T) # 協(xié)方差矩陣
  e,EV = linalg.eigh(M) # 特征值和特征向量
  tmp = dot(X.T,EV).T # 這就是緊致技巧
  V = tmp[::-1] # 由于最后的特征向量是我們所需要的,所以需要將其逆轉(zhuǎn)
  S = sqrt(e)[::-1] # 由于特征值是按照遞增順序排列的,所以需要將其逆轉(zhuǎn)
  for i in range(V.shape[1]):
    V[:,i] /= S
else:
  # PCA- 使用SVD 方法
  U,S,V = linalg.svd(X)
  V = V[:num_data] # 僅僅返回前nun_data 維的數(shù)據(jù)才合理

# 返回投影矩陣、方差和均值
return V,S,mean_X

四、Scipy

4.1 圖像模糊

# 圖像模糊
# Scipy 庫
from PIL import Image
from numpy import *
from scipy.ndimage import filters

im=array(Image.open('pic/building.tif').convert('L'))
# filters.gaussian_filter第二個參數(shù)是標準差
im2=filters.gaussian_filter(im,9)
imshow(im2)

from PIL import Image
# 彩色通道,三通道分別進行高斯濾波
im=array(Image.open('pic/landmark500x500.jpg'))
im2=np.zeros((im.shape))
for i in arange(3):
    im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2)
    
# 轉(zhuǎn)換為(0,255),否則imshow顯示不出來
im2=uint8(im2)
figure(figsize=(5,5),dpi=80)
imshow(im2)
axis('off')

4.2 圖像導數(shù)

from PIL import Image
from numpy import *
from scipy.ndimage import filters

# filters.sobel(src,0/1,dst),0表示y方向的方向?qū)?shù),1表示x方向的方向?qū)?shù)

figure()
im=array(Image.open('pic/building.tif'))
imshow(im)


imx=np.zeros(im.shape)

imy=np.zeros(im.shape)
filters.sobel(im,0,imy)
figure()
imx=uint8(imy)
imshow(imy)

figure()
filters.sobel(im,1,imx)
imy=uint8(imx)
imshow(imx)

figure()
mag=sqrt(imx**2+imy**2)
mag=uint8(mag)
imshow(mag)

show()

第二/三張圖是sobel算子在x/y方向的導數(shù),第四張圖是兩個導數(shù)疊加成梯度。

4.3 形態(tài)學計數(shù)

# 形態(tài)學 對象計數(shù)
from scipy.ndimage import measurements,morphology

im=array(Image.open('pic/zhiwen.tif').convert('L'))
im2=np.zeros(im.shape)
im2=1*(im128)

labels,nbr_objects=measurements.label(im2)

print(f"Number of objects is {nbr_objects}.")

labels=np.uint8(labels)
imshow(labels)

im_open=morphology.binary_opening(im2,ones((3,3)),1)
labels_open,nbr_objects_open=measurements.label(im_open)
print(f"Number of objects is {nbr_objects_open}.")

imshow(labels_open)


形態(tài)學計數(shù)使用label()函數(shù),令圖像的灰度值為標簽,圖一找到了114個物體,圖二經(jīng)過開操作,找到了17個物體。

到此這篇關(guān)于Python一些基本的圖像操作和處理總結(jié)的文章就介紹到這了,更多相關(guān)Python圖像操作和處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 使用Python給頭像戴上圣誕帽的圖像操作過程解析
  • Python用Pillow(PIL)進行簡單的圖像操作方法
  • 2021年最新用于圖像處理的Python庫總結(jié)
  • python圖像處理基本操作總結(jié)(PIL庫、Matplotlib及Numpy)
  • Python圖像處理之膨脹與腐蝕的操作
  • python opencv圖像處理(素描、懷舊、光照、流年、濾鏡 原理及實現(xiàn))

標簽:長春 安慶 洛陽 吉林 泉州 岳陽 怒江 清遠

巨人網(wǎng)絡通訊聲明:本文標題《Python一些基本的圖像操作和處理總結(jié)》,本文關(guān)鍵詞  Python,一些,基本,的,圖像,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python一些基本的圖像操作和處理總結(jié)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python一些基本的圖像操作和處理總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章