1、簡介
scikit-image:skimage包的全稱是scikit-image SciKit (toolkit for SciPy) ,它對scipy.ndimage進行了擴充,提供了更多的圖檔處理功能。它是由python語言編寫的,由scipy 社群開發和維護;skimage包由許多的子子產品組成,各個子子產品提供不同的功能;特點:輕量,易安裝,易使用,輕量級
opencv:OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口;OpenCV是圖像處理的絕對大佬,內建各種圖像處理功能;特點:環境難搭建,重量型,內建功能較多
對比:scikit-image在結合tf圖檔處理具有一定的優勢,使用pip install scikit-image就可以安裝,一般TF資料集使用選用scikit-image進行處理
2、skimage
包含的主要子子產品:
- io:讀取、儲存和顯示圖檔或視訊
- data:提供一些測試圖檔和樣本資料
- color:顔色空間變換
- filters:圖像增強、邊緣檢測、排序濾波器、自動門檻值等
- draw:操作于numpy數組上的基本圖形繪制,包括線條、矩形、圓和文本等
- transform:幾何變換或其它變換,如旋轉、拉伸和拉東變換等
- morphology:形态學操作,如開閉運算、骨架提取等
- exposure:圖檔強度調整,如亮度調整、直方圖均衡等
- feature:特征檢測與提取等
- measure:圖像屬性的測量,如相似性或等高線等
- segmentation:圖像分割
- restoration:圖像恢複
- util:通用函數
使用列舉:
from skimage import io, transform # skimage常用子產品
import matplotlib.pyplot as plt # 一般用來結合skimage現實圖像使用
import numpy as np # skimage讀取的圖檔是以numpy的資料類型存放,一般要使用到
train_dir = r'H:\pictures\face\1.jpg' # 圖檔路徑
image = io.imread(train_dir) # 讀圖檔
plt.imshow(image) # 顯示圖檔
plt.show() # 配合imshow顯示圖檔
image = transform.resize(image, (208, 160), mode='constant') # 改變圖檔大小
img = image * 255 # 将圖檔的取值範圍改成(0~255)
img = img.astype(np.uint8) # 改變資料存放類型
io.imsave(r'H:\pictures\face\test1.jpg', image) # 儲存圖檔到固定目錄下
""" 具體功能實作 """
# 加入噪聲,将像素點設定成255(白色)、0(黑色)
def add_noise(image):
rows, cols, dim3 = image.shape
print rows, cols, dim3
n = rows * cols / 10
print n
for i in range(n):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
print x,y
image[x, y, :] = 255
return image
# 圖像剪切
roi=image[12:120, 10:110, :] # 注意圖像的資料存放是三維的(長、寬、深度)
io.imshow(roi)
io.show()
# 二值化處理
from skimage import io, color
image1=io.imread(r'H:\pictures\face\1.jpg')
img_gray=color.rgb2gray(image1)
rows,cols=img_gray.shape
for i in range(rows):
for j in range(cols):
if (img_gray[i,j]<=0.8):
img_gray[i,j]=0
else:
img_gray[i,j]=1
# 使用了color子產品的rgb2gray()函數,将彩色三通道圖檔轉換成灰階圖。轉換結果為float64類型的數組,範圍為[0,1]之間。
io.imshow(img_gray)
io.show()
# 讀取圖檔屬性顯示
img = io.imread(dir)
print(type(img)) # 顯示類型
print(img.shape) # 顯示尺寸
print(img.shape[0]) # 圖檔寬度
print(img.shape[1]) # 圖檔高度
print(img.shape[2]) # 圖檔通道數
print(img.size) # 顯示總像素個數
print(img.max()) # 最大像素值
print(img.min()) # 最小像素值
print(img.mean()) # 像素平均值
3、OpenCV
簡易函數調用整理,詳細講解請參考如下連結:
import cv2 # 圖像處理的庫OpenCv
# cv2.imread讀出的圖檔格式是uint8 ,value也是numpy array 類型。唯一的差別是,
# 圖像資料格式是以BGR的格式進行存儲的。需要将存儲類型改成RGB 的形式才能正常顯示原
# 圖的顔色。特别是制作tfrecord 時,需要将圖檔通道改成RGB,具體代碼如下
image = cv2.imread(train_dir) # 得到一個灰白色的圖檔
b, g, r = cv2.split(image) # 将圖像通道分離開
rgb_image = cv2.merge([b, g, r]) # 以RGB的形式重新組合
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 也可以使用這個函數直接轉換成RGB 形式
cv2.imshow("face", rgb_image) # 顯示圖檔,第一參數為顯示的視窗名字,第二個參數為圖像資料
cv2.waitKey(0) # 0代表無限期等待,機關毫秒
cv2.destroyAllWindow() # 銷毀所有視窗
cv2.destroyWindow(wname) # 銷毀指定視窗
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95]) # 儲存圖像
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])
cv2詳細講解連結
4、dlib檢測人臉利器
- Dlib是一個包含機器學習算法的C++開源工具包,可以繪畫人臉指紋
- 代碼用途:根據給定圖檔,檢測出圖檔中包含的人臉,并将人臉圖檔大小儲存到固定目錄,檢測使用技術:Landmark人臉68個關鍵點檢測dat模型庫
import dlib # 人臉識别的庫dlib
import numpy as np # 資料處理的庫numpy
import cv2 # 圖像處理的庫OpenCv
# dlib預測器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 讀取圖像的路徑
path = r"H:\pictures\face\4.png"
img = cv2.imread(path)
# 用來存儲生成的單張人臉的路徑
path_save = r"H:\pictures\face\simple_faces/"
# dlib檢測
dets = detector(img, 1)
print("人臉數:", len(dets))
for k, d in enumerate(dets):
# 計算矩形大小
# (x,y), (寬度width, 高度height)
pos_start = tuple([d.left(), d.top()])
pos_end = tuple([d.right(), d.bottom()])
# 計算矩形框大小
height = d.bottom() - d.top()
width = d.right() - d.left()
# 根據人臉大小生成空的圖像
img_blank = np.zeros((height, width, 3), np.uint8)
for i in range(height):
for j in range(width):
img_blank[i][j] = img[d.top()+i][d.left()+j]
cv2.imshow("face_"+str(k+1), img_blank)
cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank)
cv2.waitKey(0)
注意:
1、以上代碼我發現在一張圖檔檢測出來多個人臉,儲存資料的時候有一定的問題,調試半天沒有調試好,希望有大牛調試好能指導一下,單張人臉圖檔儲存是沒有問題的
2、shape_predictor_68_face_landmarks.dat 訓練模型需要自己先下載下傳,百度可以搜尋到,放到和代碼同級目錄即可