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进行处理
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()) # 像素平均值
简易函数调用整理,详细讲解请参考如下链接:
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详细讲解链接
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 训练模型需要自己先下载,百度可以搜索到,放到和代码同级目录即可