图像处理 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 训练模型需要自己先下载,百度可以搜索到,放到和代码同级目录即可

你可能感兴趣的:(机器学习,图像处理,python)