图像识别

注意: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相关推荐

  1. android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...

    利用OpenCV实现实时图像识别和图像跟踪 图像识别 什么是图像识别 图像识别,是指利用计算机对图像进行处理.分析和理解,以识别各种不同模式的目标和对像的技术.根据观测到的图像,对其中的物体分辨其类别 ...

  2. Android 图片识别、图像识别

    实现效果       基于百度智能云实现的图片识别 实现步骤 1.到百度智能云注册图像识别应用 https://console.bce.baidu.com/ai/?_=1574674029784&am ...

  3. 图像处理与图像识别笔记(一)

    本系列是研一课程<图像处理与图像识别>的随堂笔记,主要内容是数字图像处理方面,根据老师的讲课内容与自己的理解所书写,还会有一些具体实现的代码,基于Python,欢迎交流.本篇主要介绍图像处 ...

  4. ios apple语音性别_如何使用Apple的CoreML和Vision API构建图像识别iOS应用

    ios apple语音性别 by Mark Mansur 马克·曼苏尔(Mark Mansur) 如何使用Apple的CoreML和Vision API构建图像识别iOS应用 (How to buil ...

  5. 小程序实现分享图片_实现自己的图像识别,基于百度sdk的的图片识别项目

    图片识别的sdk有很多,之前挑选了几个比较常用的功能做了一个小程序,现在分享一下,下篇文章分享小程序的实现,小程序实现更多功能,如语音识别 代码==免费==下载:https://download.cs ...

  6. 图像识别-百度AI开放平台

    1.注册百度账号 百度AI 百度智能云 二.获取access_token 使用百度AI开放平台,先创建应用.选择「图像识别」,创建一个新的应用. 三.使用图像识别的接口 1.接口 HTTP 方法:PO ...

  7. Android apps 拍立知-基于百度Ai的图像识别与tts语音合成(介绍)

    一款基于百度Ai的图像识别与tts语音合成的Android apps-拍立知. 这款apps是拿来参加小比赛的,理工男没有ui!界面有点小丑. 原理是通过拍照/上传图片,调用百度Ai中的图像通用识别功 ...

  8. 图像识别教程(百度AI开放平台)

    百度AI开放平台 官网准备 网址 百度AI开放平台:http://ai.baidu.com/ 登录/注册 没有注册过百度账号可以先去注册一个. 打开控制台 选择图像识别 创建应用 正确填写 得到对应A ...

  9. 百度图像识别API调用(python)

    申请百度API的账户 创建应用 代码编写 图像识别 Python SDK目录结构 ├── README.md ├── aip //SDK目录 │ ├── __init__.py //导出类 │ ├── ...

最新文章

  1. defaultdict python_python中defaultdict的用法详解
  2. JavaScript导出Excel通用代码。
  3. openoffice 安装后中文字符乱码问题
  4. java基础(二) 自增自减与贪心规则
  5. 企业级BI分析解决方案,解决数据应用难题
  6. 推荐 | 方便好用的浏览器插件
  7. graphpad两组t检验_独立双样本检验(假设检验)
  8. 电脑更新重启后黑屏_手机黑屏了,重启后万事大吉?那可就错了!
  9. 007-配置IP和DNS
  10. TensorFlow2.0:数据统计
  11. 周边pd是什么意思_pd是什么意思?饭圈说的pd是什么意思
  12. PLC系统调试的步骤
  13. SQL 分组排序group by
  14. 荷兰版《口袋妖怪GO》:不找小精灵,找免费啤酒!
  15. cypher第一章背景与攻略
  16. 【EMC基础篇①】噪声是什么?EMC是什么?噪声损害是电子社会的现代病
  17. 读LEO《程序员羊皮卷》心得笔记
  18. JAVA如何调用API
  19. matlab 找不到 mcr,如何在没有MCR / MATLAB的情况下在C#中使用MATLAB编译的DLL?
  20. 百度地图 --- 自定义标注点

热门文章

  1. 制作图书简介页面(JavaScript)
  2. ORAN专题系列-8:5G O-RAN 分体式小基站Option8硬件白盒化的参考架构
  3. Veket Linux使用(非常适合老电脑的系统)
  4. 小拌同学麻辣烫•麻辣拌,开启学生主题美食校园经济的钻石商机!
  5. 在对话框显示图片的多种方法(下)
  6. 办公室常用计算机那些能力,办公室电脑有哪些常用技巧
  7. python数据分析论文-python用于论文数据处理与展示
  8. GDI+ 你使用了吗?
  9. From Java To Kotlin - Your Cheat Sheet For Java To Kotlin Edit
  10. 肖特基势垒二极管SBD(Schottky Barrier Diode,简称肖特基二极管)