图像识别ImageRecognition
图像识别
注意:cv2中的色彩排列是(b,g,r),而matplotlib库中的排列方式是(r,g,b),本文件中采用plt进行输出,因此颜色不是准确的颜色
1. OpenCV,机器视觉
import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltoriginal = cv.imread('../data/forest.jpg')
print(original.shape, original.dtype)
cv.imshow('Original', original) # 显示图片(是非阻塞函数)
# cv.waitKey() # 等待按键响应
plt.imshow(original)
(397, 600, 3) uint8
red = np.zeros_like(original)
red[..., 0] = original[..., 0] # 0表示红色通道
cv.imshow('Red', red)
plt.imshow(red)
green = np.zeros_like(original)
green[..., 1] = original[..., 1] # 1表示绿色通道
cv.imshow('Green', green)
plt.imshow(green)
blue = np.zeros_like(original)
blue[..., 2] = original[..., 2] # 2表示蓝色通道
cv.imshow('Blue', blue)
plt.imshow(blue)
裁剪图片
h, w = original.shape[:2]
l, t = int(w / 4), int(h / 4)
r, b = int(w * 3 / 4), int(h * 3 / 4)
cropped = original[t:b, l:r]
cv.imshow('Cropped', cropped)
plt.imshow(cropped)
缩小图片
scaled1 = cv.resize(original, (int(w / 4), int(h / 4)))
plt.imshow(scaled1)
颜色差值
scaled2 = cv.resize(original, (int(w / 4), int(h / 4)), interpolation=cv.INTER_LINEAR)
plt.imshow(scaled2)
放大
scaled3 = cv.resize(scaled2, None, fx=4, fy=4, interpolation=cv.INTER_LINEAR)
plt.imshow(scaled3)
保存图片
cv.imwrite('../data/save.jpg', red)
True
2. 边缘检测
亮度梯度
- 假设一张画放在xy轴的坐标系上,z轴代大小表每个像素,形成了一个三维函数,这样可以找到亮度梯度变化最大的位置,即为某物体的边缘
可以用之前的聚类方法作为预处理,然后再边缘检测
import cv2 as cv
import matplotlib.pyplot as pltoriginal = cv.imread('../data/chair.jpg', cv.IMREAD_GRAYSCALE) # 灰度读取
plt.imshow(original)
# 索贝尔卷积
# 水平
hsobel = cv.Sobel(original, cv.CV_64F, 1, 0, ksize=5) # 1, 0为水平垂直方向开关, 卷积核为5
# CV_64FC1 64F代表每一个像素点元素占64位浮点数,通道数为1
# CV_64FC3 64F代表每一个像素点元素占64点×3个浮点数,通道数为4
# 垂直
vsobel = cv.Sobel(original, cv.CV_64F, 0, 1, ksize=5)
plt.figure(dpi=120)
plt.subplot(1, 4, 1)
plt.imshow(hsobel)
plt.subplot(1, 4, 2)
plt.imshow(vsobel)# 拉不拉丝
laplacian = cv.Laplacian(original, cv.CV_64F)
plt.subplot(1, 4, 3)
plt.imshow(laplacian)canny = cv.Canny(original, 50, 240) # 水平垂直为阈值
plt.subplot(1, 4, 4)
plt.imshow(canny)
3. 亮度提升
直方图均衡化
import cv2 as cv
import matplotlib.pyplot as pltoriginal = cv.imread('./data/sunrise.jpg')
plt.figure()
plt.imshow(original)
# 变成黑白
gray = cv.cvtColor(original, cv.COLOR_BGR2GRAY)
plt.imshow(gray)
# 经过处理后
equalized_gray = cv.equalizeHist(gray)
plt.imshow(equalized_gray)
# “Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、饱和度(Chrominance、Chroma)
yuv = cv.cvtColor(original, cv.COLOR_BGR2YUV)
yuv[..., 0] = cv.equalizeHist(yuv[..., 0])
equalized_color = cv.cvtColor(yuv, cv.COLOR_YUV2BGR)
plt.imshow(equalized_color)
4. 角点检测
平直棱线的交汇点
original = cv.imread('../data/box.png')
gray = cv.cvtColor(original, cv.COLOR_BGR2GRAY)
plt.imshow(gray)
corners = cv.cornerHarris(gray, 7, 5, 0.04)
plt.imshow(corners)
# 进行降噪,并标注
corners = cv.dilate(corners, None)
mixture = original.copy()
mixture[corners > corners.max() *0.01] = [0, 0, 255]
plt.imshow(mixture)
5. 特征点检测
original = cv.imread('../data/table.jpg')
gray = cv.cvtColor(original, cv.COLOR_BGR2GRAY)
plt.imshow(gray)
star = cv.xfeatures2d.StarDetector_create()
keypoints = star.detect(gray)
mixture = original.copy()
cv.drawKeypoints(original, keypoints, mixture, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(mixture)
# sift 小指针为梯度变化的方向,亮度变化的大小方向, 边缘的竖线基本是垂直于边缘的
sift = cv.xfeatures2d.SIFT_create()
keypoints = sift.detect(gray)
mixture = original.copy()
cv.drawKeypoints(original, keypoints, mixture, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(mixture)
6. 特征值(描述)矩阵
- 特征值(描述)矩阵
- STAR特征点(位置,大小)+SIFT(方向)
# 构建sift
_, desc = sift.compute(gray, keypoints)
print(desc.shape)
plt.matshow(desc.T, cmap='jet', fignum='Description')
plt.title('Description', fontsize=20)
plt.xlabel('Samlple', fontsize=14)
plt.ylabel('Feature', fontsize=14)
plt.tick_params(which='both', top=False, labeltop=False, labelbottom=True, labelsize=10)
plt.show()
(452, 128)
7. 识别图片中的物体
关闭相关警告,编写搜索函数
import os
import warnings
import numpy as np
import cv2 as cv
import hmmlearn.hmm as hlwarnings.filterwarnings('ignore', category=DeprecationWarning)
np.seterr(all='ignore')def search_objects(directory):directory = os.path.normpath(directory)if not os.path.isdir(directory):raise IOError("The directory '" + directory + "' doesn't exist!")objects = {}for curdir, subdirs, files in os.walk(directory): # os.walk是对返回的迭代器进行迭代for jpeg in (file for file in filesif file.endswith('.jpg')):path = os.path.join(curdir, jpeg)label = path.split(os.path.sep)[-2]if label not in objects:objects[label] = []objects[label].append(path)return objects
train_objects = search_objects('../data/objects/training')
train_x, train_y = [], []
for label, filenames in train_objects.items():descs = np.array([])for filename in filenames:image = cv.imread(filename)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)h, w = gray.shape[:2]f = 200 / min(h, w)gray = cv.resize(gray, None, fx=f, fy=f)star = cv.xfeatures2d.StarDetector_create()keypoints = star.detect(gray)sift = cv.xfeatures2d.SIFT_create()_, desc = sift.compute(gray, keypoints)if len(descs) == 0:descs = descelse:descs = np.append(descs, desc, axis=0)train_x.append(descs)train_y.append(label)
models = {}
for descs, label in zip(train_x, train_y):model = hl.GaussianHMM(n_components=4, covariance_type='diag', n_iter=1000)models[label] = model.fit(descs)
test_objects = search_objects('../data/objects/testing')
test_x, test_y, test_z = [], [], []
for label, filenames in test_objects.items():test_z.append([])descs = np.array([])for filename in filenames:image = cv.imread(filename)test_z[-1].append(image)gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)h, w = gray.shape[:2]f = 200 / min(h, w)gray = cv.resize(gray, None, fx=f, fy=f)star = cv.xfeatures2d.StarDetector_create()keypoints = star.detect(gray)sift = cv.xfeatures2d.SIFT_create()_, desc = sift.compute(gray, keypoints)if len(descs) == 0:descs = descelse:descs = np.append(descs, desc, axis=0)test_x.append(descs)test_y.append(label)pred_test_y = []
for descs in test_x:best_score, best_label = None, Nonefor label, model in models.items():score = model.score(descs)if (best_score is None) or (best_score < score):best_score, best_label = score, labelpred_test_y.append(best_label)
i = 0
for label, pred_label, images in zip(test_y, pred_test_y, test_z):for image in images:i += 1cv.imshow('{} - {} {} {}'.format(i, label, '==' if label == pred_label else '!=', pred_label), image)
cv.waitKey()
图像识别ImageRecognition相关推荐
- android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...
利用OpenCV实现实时图像识别和图像跟踪 图像识别 什么是图像识别 图像识别,是指利用计算机对图像进行处理.分析和理解,以识别各种不同模式的目标和对像的技术.根据观测到的图像,对其中的物体分辨其类别 ...
- Android 图片识别、图像识别
实现效果 基于百度智能云实现的图片识别 实现步骤 1.到百度智能云注册图像识别应用 https://console.bce.baidu.com/ai/?_=1574674029784&am ...
- 图像处理与图像识别笔记(一)
本系列是研一课程<图像处理与图像识别>的随堂笔记,主要内容是数字图像处理方面,根据老师的讲课内容与自己的理解所书写,还会有一些具体实现的代码,基于Python,欢迎交流.本篇主要介绍图像处 ...
- ios apple语音性别_如何使用Apple的CoreML和Vision API构建图像识别iOS应用
ios apple语音性别 by Mark Mansur 马克·曼苏尔(Mark Mansur) 如何使用Apple的CoreML和Vision API构建图像识别iOS应用 (How to buil ...
- 小程序实现分享图片_实现自己的图像识别,基于百度sdk的的图片识别项目
图片识别的sdk有很多,之前挑选了几个比较常用的功能做了一个小程序,现在分享一下,下篇文章分享小程序的实现,小程序实现更多功能,如语音识别 代码==免费==下载:https://download.cs ...
- 图像识别-百度AI开放平台
1.注册百度账号 百度AI 百度智能云 二.获取access_token 使用百度AI开放平台,先创建应用.选择「图像识别」,创建一个新的应用. 三.使用图像识别的接口 1.接口 HTTP 方法:PO ...
- Android apps 拍立知-基于百度Ai的图像识别与tts语音合成(介绍)
一款基于百度Ai的图像识别与tts语音合成的Android apps-拍立知. 这款apps是拿来参加小比赛的,理工男没有ui!界面有点小丑. 原理是通过拍照/上传图片,调用百度Ai中的图像通用识别功 ...
- 图像识别教程(百度AI开放平台)
百度AI开放平台 官网准备 网址 百度AI开放平台:http://ai.baidu.com/ 登录/注册 没有注册过百度账号可以先去注册一个. 打开控制台 选择图像识别 创建应用 正确填写 得到对应A ...
- 百度图像识别API调用(python)
申请百度API的账户 创建应用 代码编写 图像识别 Python SDK目录结构 ├── README.md ├── aip //SDK目录 │ ├── __init__.py //导出类 │ ├── ...
最新文章
- defaultdict python_python中defaultdict的用法详解
- JavaScript导出Excel通用代码。
- openoffice 安装后中文字符乱码问题
- java基础(二) 自增自减与贪心规则
- 企业级BI分析解决方案,解决数据应用难题
- 推荐 | 方便好用的浏览器插件
- graphpad两组t检验_独立双样本检验(假设检验)
- 电脑更新重启后黑屏_手机黑屏了,重启后万事大吉?那可就错了!
- 007-配置IP和DNS
- TensorFlow2.0:数据统计
- 周边pd是什么意思_pd是什么意思?饭圈说的pd是什么意思
- PLC系统调试的步骤
- SQL 分组排序group by
- 荷兰版《口袋妖怪GO》:不找小精灵,找免费啤酒!
- cypher第一章背景与攻略
- 【EMC基础篇①】噪声是什么?EMC是什么?噪声损害是电子社会的现代病
- 读LEO《程序员羊皮卷》心得笔记
- JAVA如何调用API
- matlab 找不到 mcr,如何在没有MCR / MATLAB的情况下在C#中使用MATLAB编译的DLL?
- 百度地图 --- 自定义标注点
热门文章
- 制作图书简介页面(JavaScript)
- ORAN专题系列-8:5G O-RAN 分体式小基站Option8硬件白盒化的参考架构
- Veket Linux使用(非常适合老电脑的系统)
- 小拌同学麻辣烫•麻辣拌,开启学生主题美食校园经济的钻石商机!
- 在对话框显示图片的多种方法(下)
- 办公室常用计算机那些能力,办公室电脑有哪些常用技巧
- python数据分析论文-python用于论文数据处理与展示
- GDI+ 你使用了吗?
- From Java To Kotlin - Your Cheat Sheet For Java To Kotlin Edit
- 肖特基势垒二极管SBD(Schottky Barrier Diode,简称肖特基二极管)