如果您想了解PythonOpenCV图像处理之直方图的应用,取经之旅第24天和pythonopencv直方图均衡的知识,那么本篇文章将是您的不二之选。我们将深入剖析PythonOpenCV图像处理之直
如果您想了解Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天和python opencv直方图均衡的知识,那么本篇文章将是您的不二之选。我们将深入剖析Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天的各个方面,并为您解答python opencv直方图均衡的疑在这篇文章中,我们将为您介绍Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天的相关知识,同时也会详细的解释python opencv直方图均衡的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天(python opencv直方图均衡)
- 36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录
- AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)
- cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:
- OpenCV - Windows(win10)编译 opencv + opencv_contrib
Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天(python opencv直方图均衡)
Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。
Python OpenCV
-
- 基础知识铺垫
- cv2.compareHist 函数
- 橡皮擦的小节
基础知识铺垫
上篇博客 Python OpenCV 图像处理之图像直方图,取经之旅第 23 天中,我们重点学习了直方图的绘制方法与应用,本篇博客继续对直方图进行分析。
本篇博客咱们首先学习一下,如何用直方图去比较两幅图片的相似性。
通过 cv2.compareHist 函数计算图片的相似度,在今天的学习中,橡皮擦并没有 get 到一个特别好的场景,故本部分从语法角度进行学习。
cv2.compareHist 函数
该函数原型如下:
cv2.compareHist(H1, H2, method)
参数说明如下:
- H1,H2:要比较图像的直方图;
- 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 plt
def create_gray_hist(image):
# 创建一个灰度直方图
img = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
hist = cv.calcHist([img], [0], None, [256], [0, 256])
return hist
def 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) & 0xFF
if 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个bins
rgbhist = np.zeros([16 * 16 * 16, 1], np.float32)
bsize = 256 / 16
for 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] += 1
plt.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
关于上文提及的 巴氏距离
,卡方
都属于统计学知识,暂时按下不表。
橡皮擦的小节
希望今天的一个小时,你有所收获,我们下篇博客见~
相关阅读
- Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
- Python 爬虫小课,精彩 9 讲
今天是持续写作的第 66 / 100 天。
如果你有想要交流的想法、技术,欢迎在评论区留言。
如果你想跟博主建立亲密关系,可以关注博主,或者关注博主公众号 “
非本科程序员
”,了解一个非本科程序员是如何成长的。
博主 ID:梦想橡皮擦
,希望大家点赞、评论、收藏
本文同步分享在 博客 “梦想橡皮擦”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与 “OSC 源创计划”,欢迎正在阅读的你也加入,一起分享。
36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录
基础版学习笔记传送门
36 篇博文带你学完 opencv :python3+opencv 学习笔记汇总目录(基础版)
进阶版笔记
项目 |
---|
opencv 进阶学习笔记 1: 调用摄像头用法大全(打开摄像头,打开摄像头并实时不断截屏,读取视频并截图) |
opencv 进阶学习笔记 2:numpy 操作图像,色彩空间,查找指定颜色范围,通道分离与合并 |
opencv 进阶学习笔记 3:像素运算和图像亮度对比度调节 |
opencv 进阶学习笔记 4:ROI 和泛洪扩充 |
opencv 进阶学习笔记 5:图像模糊操作,图像锐化,边缘保留滤波 EPF(图像滤镜) |
opencv 进阶学习笔记 6:使用鼠标在图像上绘制矩形框或者多边形框 |
opencv 进阶学习笔记 7:直方图,直方图均衡化,直方图比较,直方图反向投影 |
opencv 进阶学习笔记 8:模板匹配 |
opencv 进阶学习 9:图像阈值大全,图像二值化,超大图像二值化 |
opencv 进阶学习笔记 10:图像金字塔和图像梯度 |
opencv 进阶学习笔记 11:cannny 边缘检测,直线检测,圆检测 |
opencv 进阶学习笔记 12:轮廓发现和对象测量 |
opencv 进阶学习笔记 13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python 版 |
opencv 进阶学习笔记 14:分水岭算法 实现图像分割 |
OpenCV 告一段落,接下来,该实战啦。
计算机视觉三大任务,分类,监测,分割。
意见其他一些任务…
图像生成,OCR…
电气专业的计算机萌新,写博文不容易,如果你觉得本文对你有用,请点个赞支持下,谢谢。
AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)
如何解决AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)
我决定尝试 Ar 是什么,但遇到了以下问题:
File "C:/Users/Егор/PycharmProjects/ARfotoandvideo/AR.py",line 25,in <module>
macthes = bf.knnMatch(des1,des2,k=2)
cv2.error: OpenCV(4.5.1) C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\pip-req-build-0ycehs0d\\opencv\\modules\\core\\src\\batch_distance.cpp:275: error: (-215:Assertion Failed) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) in function ''cv::batchdistance''
堆栈:
- Windows 8.1 一种语言
- Python 3.7.7
- Pycharm 社区 2018.3.7
- Opencv-python 4.5.1.48
- 网络摄像头 - 在笔记本电脑上,我无法通过 wifi 连接通过 Droidcam 应用程序使用小米手机 Redmy 的摄像头。
信息
我将尝试描述之前发生的错误以及我是如何解决它们的 - 也许这会告诉您需要做什么来解决问题。
在程序执行期间,在从网络摄像头接收图像时发生崩溃 - 正如它本身所表现的那样,当程序启动时,来自网络摄像头的图像提供单色背景(在我的情况下,绿松石) ,当我通过点击X强行关闭所有窗口后,窗口中的数据被刷新并获得正确的图像。 cv2.waitKey (100)
部分解决了这个问题,其中更改 100 的值会导致来自网络摄像头的图像出现,!!!!但 !!!因为有失败,所以没有确定性。
尝试将 cv2.error
中所有可能的错误原因联系起来后,我得出的结论是问题出在 1 和 2 图像上的描述符中。我想指出的是,当网络摄像头相对于图像移动(不是缩放,而是前后移动)时,在 30 种情况下的 1-2 种情况下,它有助于启动程序并正常工作而不会崩溃。>
我的代码
import cv2
import numpy as np
cap = cv2.VideoCapture(1,cv2.CAP_DSHOW)
imgTarget = cv2.imread(''foto.jpg'')
myVid = cv2.VideoCapture(''video.mp4'')
success,imgVideo = myVid.read()
hT,wT,cT = imgTarget.shape
imgVideo = cv2.resize(imgVideo,(wT + 400,hT))
orb = cv2.ORB_create(nfeatures=10)
kp1,des1 = orb.detectAndCompute(imgTarget,None)
imgTarget = cv2.drawKeypoints(imgTarget,kp1,None)
while True:
success,imgWebcam = cap.read()
kp2,des2 = orb.detectAndCompute(imgWebcam,None)
imgWebcam = cv2.drawKeypoints(imgWebcam,kp2,None)
# imgWebcam = cv2.resize(imgWebcam,(wT,hT))
bf = cv2.BFMatcher()
macthes = bf.knnMatch(des1,k=2)
good = []
for m,n in macthes:
if m.distance < 0.75 * n.distance:
good.append(m)
print(len(good))
imgFeatures = cv2.drawMatches(imgTarget,imgWebcam,good,None,flags=2)
if len(good) > 20:
srcPts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
dstPts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,2)
matrix,mask = cv2.findHomography(srcPts,dstPts,cv2.RANSAC,5)
print(matrix)
pts = np.float32([[0,0],[0,wT],[wT,hT],0]]).reshape(-1,2)
dst = cv2.perspectiveTransform(pts,matrix)
img2 = cv2.polylines(imgWebcam,[np.int32(dst)],True,(255,255),3)
cv2.imshow(''img2'',img2)
cv2.imshow(''imgFeatures'',imgFeatures)
cv2.imshow(''imgTarget'',imgTarget)
cv2.imshow(''myVid'',imgVideo)
cv2.imshow(''imgWebcam'',imgWebcam)
cv2.waitKey(100)
cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:
image1=Image.fromarray(cv2.cvtColor(image01,cv2.COLOR_BGR2RGB))
cv2.error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function ''cvtColor''
这个错误纠结了一周,网上找遍了答案,加上自己根据他们错误找,大多数都是图片路径,或者图片本身的错误
我自己的错误是 xml 转 json 文件出错,在看完一周重新分割数据以及转 json,终于可以运行。
这类错误大多数是图片路径读取有问题,大家可以先去找图片路径拼接那块是不是出现 None,可以适当打印出路径来调试,当然出现这种错误,最先看看,自己对图片的处理是不是正确的,基本上跑源码,除了个别修改配置文件,其他没问图,所以最讨厌的问题得抓最核心的地方,毕竟时间宝贵!!!
OpenCV - Windows(win10)编译 opencv + opencv_contrib
在之前的几篇文章中,我提到了在 Android、Linux 中编译 opencv + opencv_contrib,这篇文章主要讲在 Windows 中编译 opencv + opencv_contrib。
首先需要准备的环境有:
- Window 10 64 位:这个大家都知道,就不多说了啊;
- Cmake:编译工具,可以 https://cmake.org/download/ 下载安装,当前的最新版本为 3.10.1;
- Visual Studio:开发工具,编译的时候也需要用到,我安装的是 Visual Studio 2015。
- OpenCV Windows 包,下载地址:https://opencv.org/releases.html;
- OpenCV_Contrib 包,下载地址:https://github.com/opencv/opencv_contrib(注意版本对应)。
将下载得到的 OpenCV Windows 包解压,目录为 opencv,然后将下载的 OpenCV_Contrib 包解压放入 opencv 目录下,新建 new_build 文件夹(用来放编译之后结果):
使用 cmake 生成 OpenCV.sln:
打开安装之后的 cmake,在 where is the source code 中选择 openCV 的源代码目录:F:\opencv\sources;在 where to build the binaries 中选择编译为 Visual Studio 项目的目录:F:\opencv\new_build(这里我选择刚刚特地建立的 new_build 目录),如下图所示:
点击 Configure 按钮后,弹出对话框,选择编译器,根据本地计算机的 CPU 架构,这里特别要注意的是,自己机器上是否装有相应的 VS 版本,如果没有装,还是要编译就会出错,可能是找不到对应的工具原因,以及选择 X86 和 X64),这里用的是 VS 2015。
设置完成之后点击 “Generate” 开始生成工程,. 第一次编译完成之后,我们需要将额外的 opencv_contrib 加到工程中进行第二次编译,在配置表中找到 “OPENCV_EXTRA_MODULES_PATH”, 设置其参数值为 open_contrib 源码包中的 modles 目录,我的目录是 “F:\opencv\opencv_contrib\modules”:
再次点击 “Generate” 进行第二次编译:
这时候我们已经可以看见用 cmake 工具编译得到的 OpenCV.sln:
用 VS 打开 OpenCV.sln 工程,编译生成 Debug 和 Release 库:
用 VS 2015 打开 OpenCV.sln 工程,在解决方案中可以查看工程目录:
编译生成 debug 版本的库,记得在此之前要选择编译的平台信息,这就是编译生成 debug 版本和 release 版本的区别,也可以选择 release,因为自己的工程可能要用到相应的动态链接库:
在解决方案中选中工程,右键选择重新生成解决方案:
编译成功:
. 找到 CMakeTargets 中的 INSTALL,然后右键选择 “仅限于项目”-->“仅生成 INSTALL”:
完成编译后,Release 模式下同理。此时,有了 install 目录。该目录包含了我们需要的头文件、库文件。
把新的库文件配置到到项目中:
VC++ 目录 --> 包含目录,添加:
E:\OpenCV320\opencv\new_build\install\include
VC++ 目录 --> 库目录,添加:
E:\OpenCV320\opencv\new_build\install\x64\vc14\lib
链接器 --> 输入 --> 附加依赖项,添加: (注意添加的库与编译选项要一致,需要注意 debug 比 release 的文件名多了个 d)
opencv_aruco320.lib
opencv_aruco320d.lib
opencv_bgsegm320.lib
opencv_bgsegm320d.lib
opencv_bioinspired320.lib
opencv_bioinspired320d.lib
opencv_calib3d320.lib
opencv_calib3d320d.lib
opencv_ccalib320.lib
opencv_ccalib320d.lib
opencv_core320.lib
opencv_core320d.lib
opencv_datasets320.lib
opencv_datasets320d.lib
opencv_dnn320.lib
opencv_dnn320d.lib
opencv_dpm320.lib
opencv_dpm320d.lib
opencv_face320.lib
opencv_face320d.lib
opencv_features2d320.lib
opencv_features2d320d.lib
opencv_flann320.lib
opencv_flann320d.lib
opencv_fuzzy320.lib
opencv_fuzzy320d.lib
opencv_highgui320.lib
opencv_highgui320d.lib
opencv_imgcodecs320.lib
opencv_imgcodecs320d.lib
opencv_line_descriptor320.lib
opencv_line_descriptor320d.lib
opencv_ml320.lib
opencv_ml320d.lib
opencv_objdetect320.lib
opencv_objdetect320d.lib
opencv_optflow320.lib
opencv_optflow320d.lib
opencv_phase_unwrapping320.lib
opencv_phase_unwrapping320d.lib
opencv_photo320.lib
opencv_photo320d.lib
opencv_plot320.lib
opencv_plot320d.lib
opencv_reg320.lib
opencv_reg320d.lib
opencv_rgbd320.lib
opencv_rgbd320d.lib
opencv_saliency320.lib
opencv_saliency320d.lib
opencv_shape320.lib
opencv_shape320d.lib
opencv_stereo320.lib
opencv_stereo320d.lib
opencv_stitching320.lib
opencv_stitching320d.lib
opencv_structured_light320.lib
opencv_structured_light320d.lib
opencv_superres320.lib
opencv_superres320d.lib
opencv_surface_matching320.lib
opencv_surface_matching320d.lib
opencv_text320.lib
opencv_text320d.lib
opencv_tracking320.lib
opencv_tracking320d.lib
opencv_video320.lib
opencv_video320d.lib
opencv_videoio320.lib
opencv_videoio320d.lib
opencv_videostab320.lib
opencv_videostab320d.lib
opencv_xfeatures2d320.lib
opencv_xfeatures2d320d.lib
opencv_ximgproc320.lib
opencv_ximgproc320d.lib
opencv_xobjdetect320.lib
opencv_xobjdetect320d.lib
opencv_xphoto320.lib
opencv_xphoto320d.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
这样,我们就可以在 VS 中使用 OpenCV 了。
需要提到的一个点,所需要使用 Sift 等算法,需要引入 xfeatures2d 命名空间:
using namespace xfeatures2d;
今天关于Python OpenCV 图像处理之直方图的应用,取经之旅第 24 天和python opencv直方图均衡的分享就到这里,希望大家有所收获,若想了解更多关于36 篇博文带你学完 opencv :python+opencv 进阶版学习笔记目录、AR opencv-python | cv2.error: OpenCV(4.5.1) batch_distance.cpp:275: error: (-215:Assertion failed)、cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/color.cpp:182: error:、OpenCV - Windows(win10)编译 opencv + opencv_contrib等相关知识,可以在本站进行查询。
本文标签: