使用差分散列检测重复图片

关于散列(Hash), 网上的介绍有很多,这里就不费力介绍. 而对于这个具体的项目要求来说, 我们所做的只是需要把一个图像转换为一个Hash值, 然后储存到字典中. 并且有一下要求: 视觉上相差不大的图片, 他们的Hash值也应该相同 这个Hash计算需要快, 因为有时候数据量会很大 那么我们有以下几个Hash函数的选择: 差分散列(difference hashing) md5 sha-1 最终我们选择了差分散列的方法, 有以下的原因: 差分散列速度很快, 计算量小 对于肉眼相差不大的图片, 差分散列可以得出相似的值 md5 和 sha-1 只要有一点变化, 输出值就会完全改变(这本来很好, 但在这里非常不好!) Detect and remove duplicate images from a dataset for deep learning 文章链接: https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/ https://www.pyimagesearch.com/2020/04/20/detect-and-remove-duplicate-images-from-a-dataset-for-deep-learning/?__s=bnfo5g8qgjr6gztmvjlb 前言: 为什么要删去数据集中重复的图片? Having duplicate images in your dataset creates a problem for two reasons: It introduces bias into your dataset, giving your deep neural network additional opportunities to learn patterns specific to the duplicates It hurts the ability of your model to generalize to new images outside of what it was trained on Take the time to remove duplicates from your image dataset so you don’t accidentally introduce bias or hurt the ability of your model to generalize....

April 22, 2020 · 2 min

[CV] 模版匹配

API matchTemplate();//模式查找,API比较简单 minMaxLoc();//用于在模式查找的输出图像中找到极值点,也就是匹配点 笔记 模板匹配(Templet Match) 相当于上一节说的直方图匹配的实用化,通过现有图像在目标图像上滑行(原文Slide),也就是左到右上到下的以像素为单位进行匹配,找到匹配值最大的点.但也是因为这个原因,对模板图像和在目标图像里的目标的大小进行匹配就非常重要,如果大小差得远,效果就不好,所以使用条件相当苛刻. 注意输出图像的大小 在API中需要提供一个储存输出结果的Mat, 他的大小是 Size(src.cols-templ.cols+1, src.rows-templ.rows+1) OpenCV的查找模式 OpenCV提供了很多种方法,在官网上都有介绍,大部分都是取用了最大值作为最匹配 根据最小值匹配的只有 TM_SQDIFF 和 MT_SQDIFF_NORMED For the first two methods ( TM_SQDIFF and MT_SQDIFF_NORMED ) the best match are the lowest values. OpenCV中32位的图像 每个数值是一个位于[0,1]间的小数,相当于8位的[0,255] 源//API实现模式查找 // OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream>#include<opencv2\opencv.hpp> using namespace std; using namespace cv; Mat src, dst, temp; int main(int, char**) { temp = imread("D:/WorkSpace/Projects/OpenCV Learning/ImageHub/Lena....

February 20, 2020 · 2 min

[CV] 直方图均衡化-直方图比较-反向投影

API - equalizeHist();//直方图均衡化 - split();//分离通道 - calcHist();//参数dims,bin,range - waitkey(); - mixChannels//分离通道, 与split小有差别,建议看官方文档 - cvtColer//使用此api转换到hsv色彩空间 - calcHist//接受单通道图像计算直方图, 参数略微复杂 - normalize//归一化,常用 - compareHist//比较直方图,可以得到两张图片的相似程度,但是对光非常敏感 - backProject();//直方图反向投影 笔记 这里是几个关于直方图的总结, 这一堆实在是不太好懂, 并且映射和统计接触到了很多数学方面的东西,重要的是理解思路以及了解API, 这里的东西要是有不理解的都建议去看官方的教程文档 直方图均衡化 好像在人脸识别的项目总结里写过了, API并不难理解 HSV模型 HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value) 直方图比较 compareHist(); API比较方便,输入两个直方图,比较他们的相似程度 这两个直方图通常会是图像的HS直方图(虽然我现在还不太懂HS为什么可以变成一张直方图,到时候要用再看原理好了),用HS猜测是要降低算法对光线的敏感度?(实测好像对光线还是很敏感) OpenCV提供了一共四种方法 相关性计算:{-1, 1} //1最强 卡方计算:{0, ∞} //0最强 十字交叉 巴氏距离计算:{0, 1} //0最强 其中比较推荐的是相关性计算和巴氏距离计算(不需要归一化了hhhhhhhhh) 数学公式不列出了(反正我又不会去看) 直方图反向投影 mixChannels(); backProject(); 直方图反向投影是一种基于色彩的对象识别技术,通过该方法可以定位图像中已知物体的位置,反应直方图在目标图像中的分布 主要思路是提取已知图像的Hue(色相)空间,做出直方图,再反向找到这些色相在目标图片中的分布,已知图像中越多的色相,在backProject中就会(看起来)更亮,利用这点加上一些二值化,就可以得到一张目标物体的掩膜,覆盖到目标图片上就可以得到完成的图像了,如下 源//读取TIM图标, 在桌面截图上找到他 // OpenCV_Template....

February 19, 2020 · 2 min

[CV] Canny边缘检测算法

API Canny(); //Canny的API, 包含了4个步骤. 注意, 不包含高斯模糊部分 笔记 Canny边缘检测算法可以分为以下5个步骤: 使用高斯滤波器,以平滑图像,滤除噪声。(需要调用高斯模糊API) 计算图像中每个像素点的梯度强度和方向。 应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。 通过抑制孤立的弱边缘最终完成边缘检测。 非极大值抑制: 细化边缘, 但技术的实现细节并不是很懂, 大致思想是取邻域中的梯度极大值点来进行有效边缘的判断, 下面的文章讲的很详细, 可以看看. 关于几种边缘检测方法: Laplance, Canny 和 Sobel 都是边缘检测的方法, Canny是包含了Sobel算子的边缘检测, 所以可以说是Sobel的实际应用, Laplance的检测效果并不好, 但是有其他的用途, 总的来说Canny能应对大多数的场景 参考来源 《A Computational Approach to Edge Detection》 源//对NXP赛道进行下采样和边缘检测 // OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream>#include <string>#include<opencv2\opencv....

February 16, 2020 · 2 min

[CV] 霍夫线和圆检测

API /*霍夫线检测 输入图像要先Canny过 参数为 - 输入图像 - 输出向量数组,数据类型为Vec4i(就是两个点) - 默认1 - 默认CV_PI / 180, 转角步长 - 阈值(我设了100) - 最小线长 - 最大间隙, 小于这个值的两条线会连成一条, 对于断断续续的线效果好 */ void HoughLinesP( InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap = 0 ); /*霍夫圆检测 参数从前往后分别是 - 输入图像矩阵(8bit的灰度图,这个API自带Canny边缘检测) - 输出向量数组,数据类型位Vec3f - HOUGH_GRADIENT - 图像缩放,默认1 - 圆心最小距离, 小于会认为是同心圆? - Canny检测的大阈值,小的=大的除二计算 - 点重叠n个以上判定为圆,越小检出越多圆 - 最小圆半径 - 最大圆半径 */ void HoughCircles( InputArray image, OutputArray circles, int method, double dp, double minDist, double param1 = 100, double param2 = 100, int minRadius = 0, int maxRadius = 0 ); 笔记 圆检测对噪声敏感, 需要先中值滤波 太难了,建议看下面的博客,线检测还好,圆检测真的看不懂 相关 源//检出NXP赛道上的几何图 // OpenCV_Template....

February 16, 2020 · 2 min