个人博客原文链接

个人掘金链接

本文简单地介绍计算机图形处理的一些基本概念,以及一些有趣的例子和对应的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()

结果

参考文档

《OpenCV 3计算机视觉》

OpenCV 初体验的更多相关文章

  1. Swift与C++混编 OpenCV初体验 图片打码~

    OpenCV初体验,给图片打码 提到OpenCV,相信大多数人都听说过,应用领域非常广泛,使用C++开发,天生具有跨平台的优势,我们学习一次,就可以在各个平台使用,这个还是很具有诱惑力的.本文主要记录 ...

  2. opencv初体验

    http://guoming.me/opencv-config  这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...

  3. 痞子衡嵌入式:走进二维码(QR Code)的世界(2)- 初体验(PyQt5.11+MyQR2.3+ZXing+OpenCV4.2.0)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是走进二维码(QR Code)的世界专题之初体验. 接上篇 <走进二维码(QR Code)的世界(1)- 引言> 继续更文,在 ...

  4. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  5. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  6. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  7. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  8. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  9. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

随机推荐

  1. [Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

    额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长 ...

  2. JSON 数据重复 出现$ref

    JSONArray  类型  如果我们往里面add数据的时候 如果数据相同,那么就会被替换成 $ref:   也就是被简化了 因为数据一样所直接 指向上一条数据 循环引用:当一个对象包含另一个对象时, ...

  3. python常见的报错提示

    在运行或编写一个程序时常会遇到错误异常,这时python会给你一个错误提示类名,告诉出现了什么样的问题(Python是面向对象语言,所以程序抛出的异常也是类).能很好的理解这些错误提示类名所代表的意思 ...

  4. java中“==”和equals方法的区别,再加上特殊的String引用类型

    ==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为  基本数据类型  的比较和  引用数据类型 的比较 ...

  5. STM32 Cube mx 安装

    原文链接:http://www.cnblogs.com/strongerHuang/p/5778216.html Ⅰ.写在前面 相信很多人都知道STM32CubeMX这个工具,也是近年来开发STM32 ...

  6. javascript正则表达式学习(二)--位置匹配

    文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...

  7. Linux-误删apt-get以及把aptitude换回

    误删apt-get拯救我的linux 一.前言 先来说一下apt-get, 这个我们使用linux过程中最常用的命令之一. apt-get是一条linux命令,适用于deb包管理式的操作系统,主要用于 ...

  8. [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  9. spring源码 — 四、MVC

    spring mvc是怎么实现的?为什么我们只需要在方法上写一个注解,就可以通过http访问这个接口?下面我们分3部分来解答这两个问题 注意:本文是基于spring4.3.2的 spring mvc整 ...

  10. PHP 单例模式优点意义及如何实现

    一.什么是单例模式? 1.含义 作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 2. ...