Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。

Python OpenCV

  • 基础知识铺垫
  • cv2.compareHist 函数
  • 橡皮擦的小节

基础知识铺垫

上篇博客 Python OpenCV 图像处理之图像直方图,取经之旅第 25 天中,我们重点学习了直方图的绘制方法与应用,本篇博客继续对直方图进行分析。

本篇博客咱们首先学习一下,如何用直方图去比较两幅图片的相似性。

通过 cv2.compareHist 函数计算图片的相似度,在今天的学习中,橡皮擦并没有 get 到一个特别好的场景,故本部分从语法角度进行学习。

cv2.compareHist 函数

该函数原型如下:

cv2.compareHist(H1, H2, method)

参数说明如下:

  1. H1,H2:要比较图像的直方图;
  2. method: 比较方式

其中比较方式涉及如下几种枚举值。

  • cv2.HISTCMP_CORREL:相关性比较,值越大,相关度越高,最大值为 1,最小值为 0;
  • cv2.HISTCMP_CHISQR:卡方比较,值越小,相关度越高,最大值无上界,最小值 0;
  • cv2.HISTCMP_BHATTACHARYYA:巴氏距离比较,值越小,相关度越高,最大值为 1,最小值为 0;
  • cv2.HISTCMP_INTERSECT:十字交叉,值越大越相似。

先比较灰度图的,运行下述代码即可。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef create_gray_hist(image):# 创建一个灰度直方图img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)hist = cv.calcHist([img], [0], None, [256],  [0, 256])return histdef hist_compare(image1, image2):# 第一幅图的灰度图直方图hist1 = create_gray_hist(image1)# 第二幅图的灰度图直方图hist2 = create_gray_hist(image2)# 进行三种方式的直方图比较match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)match4 = cv.compareHist(hist1, hist2, cv.HISTCMP_INTERSECT)print("巴氏距离:%s, 相关性:%s, 卡方:%s, 十字交叉:%s" % (match1, match2, match3, match4))src1 = cv.imread("./black.jpg")
cv.imshow("diff1", src1)
src2 = cv.imread("./yellow.jpg")
cv.imshow("diff2", src2)plt.subplot(1, 2, 1)
plt.title("diff1")
plt.plot(create_gray_hist(src1))
plt.subplot(1, 2, 2)
plt.title("diff2")
plt.plot(create_gray_hist(src2))hist_compare(src1, src2)
plt.show()
while True:k = cv.waitKey(0) & 0xFFif k == 27:break
cv.destroyAllWindows()

结果如下图所示,这里我找的是两个相似的图片(从找不同游戏里面找到的)。

得到的结果如下:

巴氏距离:0.0501735845451386, 相关性:0.9855477082033252, 卡方:3887.8752812639, 十字交叉:166493.0

由于两张图非常相似,得到的结果也符合刚才的说明。

  • 巴氏距离:0.0501735845451386 >>> 值越小,相关度越高,最大值为 1,最小值为 0;
  • 相关性:0.9855477082033252 >>> 值越大,相关度越高,最大值为 1,最小值为 0;
  • 卡方:3887.8752812639 >>> 值越小,相关度越高,最大值无上界,最小值 0;(不过看起来,这个好像用处不大)
  • 十字交叉:166493.0 >>> 十字交叉,值越大越相似。

切换成不同的两张图片,可以看一下运行结果,首先看灰度直方图。


在看得到的各个值:

巴氏距离:0.28273836677812036, 相关性:0.4615912771396342, 卡方:186501.9955618743, 十字交叉:126877.0

接下来,我们比较一下彩色图的直方图,这部分我也在网上看到了一个算法,但是由于代码实在没看太懂,直接忽略掉了。以下代码转载自网络,建议本阶段,看一下就好,不要钻牛角尖。

代码来源:网络。

def create_rgb_hist(image):""""创建 RGB 三通道直方图(直方图矩阵)"""h, w, c = image.shape# 创建一个(16*16*16,1)的初始矩阵,作为直方图矩阵# 16*16*16的意思为三通道每通道有16个binsrgbhist = np.zeros([16 * 16 * 16, 1], np.float32)bsize = 256 / 16for row in range(h):for col in range(w):b = image[row, col, 0]g = image[row, col, 1]r = image[row, col, 2]# 人为构建直方图矩阵的索引,该索引是通过每一个像素点的三通道值进行构建index = int(b / bsize) * 16 * 16 + int(g / bsize) * 16 + int(r / bsize)# 该处形成的矩阵即为直方图矩阵rgbhist[int(index), 0] += 1plt.ylim([0, 10000])plt.grid(color='r', linestyle='--', linewidth=0.5, alpha=0.3)return rgbhist

不过,除了灰度直方图,咱们用已有的知识可以比较不同通道的直方图。

具体代码修改部分如下:

def create_gray_hist(image):# 创建一个灰度直方图# img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)hist = cv.calcHist([image], [1], None, [256],  [0, 256])return hist

关于上文提及的 巴氏距离卡方 都属于统计学知识,暂时按下不表。

橡皮擦的小节

希望今天的一个小时,你有所收获,我们下篇博客见~

相关阅读


  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 66 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。


如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞、评论、收藏。

Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天相关推荐

  1. Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图

    一步一步来吧 上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步 1.什么是图像 对于计算机而言,图像的本质是一个由像素点构成的矩阵. 例如我们用肉眼很容易分辨一辆汽车的后 ...

  2. python+opencv图像处理之七:直方图均衡化

    python+opencv图像处理之七:直方图均衡化 目录 python+opencv图像处理之七:直方图均衡化 一.直方图均衡化 二.直方图绘制 三.直方图均衡化 四.有限对比适应性直方图均衡化 一 ...

  3. Python+Opencv图像处理新手入门教程(三):阈值与二值化

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(二):颜色空间转换,图像大小调整,灰度直方图 1.Intro 今天这节我们主要研究利用阈值处理图像.例如对于输入图像: 如何做一 ...

  4. Python+OpenCV图像处理(一篇全)

    参考:1.网易云课堂 Python+OpenCV图像处理 - 网易云课堂 2.[在水一方xym的博客]业精于勤荒于嬉,行成于思毁于随 - CSDN博客 https://blog.csdn.net/za ...

  5. Python OpenCV图像处理 理论 代码

    python opencv图像处理 GitHub - LeBron-Jian/ComputerVisionPractice OpenCV计算机视觉学习 & 代码 OpenCV计算机视觉学习(1 ...

  6. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  7. Python+Opencv图像处理新手入门教程(四):视频内容的读取与导出

    一步一步来吧 上一节: Python+Opencv图像处理新手入门教程(三):阈值与二值化 1.Intro 今天这节我们主要看怎么利用opencv读取并处理视频中的内容. 2.VideoCapture ...

  8. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  9. python+opencv图像处理之边缘检测车道线识别

    python+opencv图像处理之边缘检测车道线识别 1.自行安装python和opencv 2.导入我们要使用的相关库 import cv2 from matplotlib import pypl ...

最新文章

  1. 如何将RDS的数据同步到本地自建数据库
  2. 结合video.js播放rtmp格式、flv格式、mp4等格式的视频
  3. 分布式mysql一致性问题_分布式缓存数据库一致性问题
  4. leetcode 668. Kth Smallest Number in Multiplication Table | 668. 乘法表中第k小的数(二分查找)
  5. 你真的了解用户吗?-浅谈《用户画像》的意义和方法
  6. 计算机盘不显示桌面,电脑开机后不显示Windows系统桌面怎么办?
  7. IAP升级功能编写初期的一些困惑与疑问---完毕功能后的总结
  8. WeaveScope-容器监控
  9. ftp服务器连接不了文件路径,Serv-U和CuteFTP无法连接FTP服务器问题解答
  10. 程序员高手和程序员菜鸟的区别是什么?
  11. 辐射强度和辐射亮度_如何在“辐射4”中隐藏“创意俱乐部新闻”垃圾邮件
  12. JavaScript基础学习——CSS预处理Less
  13. 什么是NoSQL数据库
  14. 用Keras解决机器学习问题!
  15. 运用javascript的成员访问特性来实现通用版的兼容所有浏览器的打开对话框功能...
  16. 软考高级系统架构设计师系列论文七:论基于构件的软件开发
  17. 生成数字相加验证码图片并验证
  18. 深入理解常见的二十三种设计模式
  19. java arraylist 无序_关于Java:按字母顺序排序arraylist(不区分大小写)
  20. fastboot unlock手机步骤

热门文章

  1. Kali运行smod框架报错‘Conf‘ object has no attribute ‘use_dnet‘
  2. 了解《2022年全球及中国汽车碳纤维车轮行业头部企业市场占有率及排名调研报告》
  3. 艾司博讯:拼多多物流单号填错了有办法改吗
  4. SpringMvc简略运行流程
  5. 研究生阶段记录2-常用名词
  6. 入门图形学:光照模型(二)
  7. Google Chrome浏览器的Cookies文件找不到问题
  8. 第十七章 BFC、置换元素、三角形、0.5像素的线/1像素边框、透明、万能清除法、隐藏元素
  9. jmeter工具的使用
  10. 计算机网络知识大赛策划,大学生知识竞赛活动策划书