天天看點

圖像處理 scikit-image、opencv、dlib簡易整理

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 訓練模型需要自己先下載下傳,百度可以搜尋到,放到和代碼同級目錄即可