个人博客原文链接
本文简单地介绍计算机图形处理的一些基本概念, 以及一些有趣的例子和对应的 Open CV 的代码操作.
顺便说一句, 恭喜 IG 夺冠!
一, 图片存储原理
1, 颜色空间 RGB
(1)RGB 三通道彩色图
图片由三维矩阵叠加而成 ([0,255]), 通俗讲就是将三个分别只有 R(red),G(green),B(blue) 的矩阵叠加.
2, 图像处理
(1)卷积 / 滤波
二, OpenCV 基础
Open CV 是一个开源的计算机视觉库, 采用 C/C++ 编写, 提供 Python,MATLAB 以及其他语言的接口.
1, 基本 I/O 操作
- #-*- coding: utf-8 -*-
- import cv2
- # 打开图片
- img = cv2.imread('lion.jpg')
- # 显示图片
- img = cv2.imshow('lion','lion.jpg')
- # 保存图片
- cv2.imwrite('lion2.jpg',img)
2, 灰度, 二值化处理
灰度化: 在 RGB 模型中, 如果 R=G=B 时, 则彩色表示一种灰度颜色.
二值化: 图像的二值化, 就是将图像上的像素点的灰度值设置为 0 或 255, 整个图像呈现出明显的只有黑和白的视觉效果
- #-*- coding: utf-8 -*-
- import cv2
- # 读取图片
- img = cv2.imread('wsc.jpeg')
- # 灰度化处理, 保存处理后文件
- img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- cv2.imwrite('wsc-gray.jpg',img)
- # 二值化处理, 保存处理后文件
- cv2.threshold(image, 550, 550, 0, image)
- cv2.imwrite('wsc-two-value.jpg',img)
图片处理前 | 灰度处理 |
---|---|
图片处理前 | 二值处理 |
3, 图片匹配
matchTemplate 用于在图像中与模板图片比对, 查找目标
cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))
关键参数
TM_SQDIFF 平方差匹配法: 该方法采用平方差来进行匹配; 最好的匹配值为 0; 匹配越差, 匹配值越大.
TM_CCORR 相关匹配法: 该方法采用乘法操作; 数值越大表明匹配程度越好.
TM_CCOEFF 相关系数匹配法: 1 表示完美的匹配;-1 表示最差的匹配.
TM_SQDIFF_NORMED 归一化平方差匹配法
TM_CCORR_NORMED 归一化相关匹配法
TM_CCOEFF_NORMED 归一化相关系数匹配法
三, 有趣的例子
1, 边缘检测
Canny 边缘检测
代码
- #-*- coding: utf-8 -*-
- import cv2
- # 读取图片
- img = cv2.imread('wsc.jpeg')
- # Canny 边缘检测处理, 并写入图片
- cv2.imwrite('wsc1.jpeg',cv2.Canny(img,200,300))
图片处理前 | 图片处理后 |
---|---|
2, 人脸检测
haarcascade_frontalface_default.xml, 该文件为人脸检测器 (默认) 文件, 文件可在 OpenCV 的 GitHub 上下载.
- #-*- coding: utf-8 -*-
- import cv2
- def detect(filename):
- face_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_frontalface_default.xml')
- # 读取图片
- img = cv2.imread(filename)
- # 图片灰度处理
- gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- # 人脸检测, 每次迭代图像压缩率, 人脸矩形保留近邻数目最小值
- faces = face_cascade.detectMultiScale(gray,1.3,6)
- # x,y 为左上角坐标, w,h 表示人脸宽度和高度
- for(x,y,w,h) in faces:
- # 检测到人脸绘制成蓝色矩形
- img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
- # 写入文件
- cv2.imwrite('/Users/fangzhijie/Pictures/ig1.jpeg',img)
- filename = 'ig.jpeg'
- detect(filename)
图片处理前 |
---|
图片处理后 |
剩下的三位没有识别出来, 待定位原因.
3, 图像匹配
搜索模板图片
原图
代码
- # -*- coding: utf-8 -*-
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
- # 读取图片
- img = cv2.imread('ig.jpeg')
- template = cv2.imread('wsc123.png')
- # 对图片进行缩放, 缩放到合适大小 90*90
- template = cv2.resize(template, (90, 90),interpolation=cv2.INTER_CUBIC)
- # 进行图像匹配
- res = cv2.matchTemplate(img,template,eval('cv2.TM_CCOEFF'))
- # 记录模板的宽度和高度
- w, h = template[:,:,0].shape[::-1]
- # 王思聪边框的具体位置
- min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
- # 画出红框
- top_left = max_loc
- bottom_right = (top_left[0] + w, top_left[1] + h)
- imgplt = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
- cv2.rectangle(imgplt,top_left, bottom_right, 255, 2)
- # 显示图片
- plt.imshow(imgplt)
- plt.title('Detected results'), plt.xticks([]), plt.yticks([])
- plt.show()
结果
来源: https://juejin.im/post/5bf8f84bf265da610f636389