准备

opencv是一个跨平台的机器学习和视觉计算软件库,由C++编写。今天主要使用它提供的Python接口来处理图像。

首先需要安装opencv库,pip install opencv-python(使用镜像下载会快一点)

同时还需要使用numpy,目前如果在电脑上没有安装numpy,那么在安装opencv的时候会同时帮你下载安装numpy。

1.读取图片并显示

  • imread():读取图片,参数为图片路径。读取成功之后会返回一个图片对象;
  • imshow():以窗口的形式展示图片,参数为窗口名与图片对象;
  • waitkey():设置窗口等待时间,若为0,则窗口保持不关闭;

2.重新调整大小并获取图片大小

  • resize():图片缩放,其中fx和fy表示缩放比例,0.5表示缩放为以前的 一半。
  • shape():返回图片的高度、宽度(单位为像素)以及色彩通道数。

3.将图片转换为HSV模型

由于RGB模型有三个色彩通道,因此无法进行腐蚀和膨胀操作。需要将RGB模型转换为HSV模型。关于这两个模型这里就不细讲了,有兴趣可以百度RGB色彩模型和HSV色彩模型。

  • cv2.cvtColor(img,cv2.COLOR_BGR2HSV)可以将彩色图片转化为hsv灰度图片。

由于历史原因,opencv使用的是BGR而非RGB。所以是BGR to HSV。

4.将图片二值化

所谓二值化就是把图片的灰度设置为0或者255,也就是黑白图片。

对于图像的处理我们也需要自定义一个最小值和最大值,这里分别用lower_blue和upper_blue表示。(因为这里处理的是蓝底的证件照)

 

  lower_blue = np.array([90,70,70])
  upper_blue = np.array([110,255,255])
  inRange(hsv, lower_blue, upper_blue)将图片进行二值化操作。
inRange()方法需要传入两个阈值,最小值和最大值。在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)。

5.图像的腐蚀和膨胀

在上一步处理之后,会出现一些噪声。而这里使用腐蚀和膨胀就是为了消除这些噪声。膨胀和腐蚀为相反的一对操作。dilate (膨胀) erode(腐蚀)都可以看作是滤波操作。这里选择一种使用即可,看谁的效果更好就用谁。

  • erode(mask,None,iterations=1)进行腐蚀操作。
  • dilate(erode,None,iterations=1)进行膨胀操作。

6.遍历像素点进行替换

最后回到我们的题目,要对证件照的背景色进行替换。在之前的步骤中,我们把人物全设置为了黑色,而背景统统变成了白色。因此最后我们只需要遍历每个像素点,把所有的白色像素点设置为我们想要的颜色就OK啦。

import cv2
import numpy as np
#读取图片
img = cv2.imread('1.jpg')
img = cv2.resize(img,None,fx=0.5,fy=0.5)
rows,cols,channels = img.shape
#转换为hsv模型
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#二值化处理
lower_blue = np.array([90,70,70])
upper_blue = np.array([110,255,255])
mask = cv2.inRange(hsv,lower_blue,upper_blue)
#腐蚀操作
erode = cv2.erode(mask,None,iterations=1)
#中值滤波
erode = cv2.medianBlur(erode,9)

if __name__ == '__main__':
    #遍历像素点
    for i in range(rows):
        for j in range(cols):
            if erode[i,j]==255:
                img[i,j]=(255,255,255)

    cv2.imshow("res",img)
    cv2.imshow("re", erode)
    #保存处理结果
    cv2.imwrite("2.jpg",img)
    cv2.waitKey(0)