![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
图像处理
文章平均质量分 66
基于opencv、Halcon
liu_jie_bin
技术栈: c++ pyhton Qt opencv halcon
展开
-
opencv 图像金字塔
文章目录概念一、opencv 函数支持概念图像金字塔:图像金字塔是图像的集合,所有图像都来自单个原始图像,这些图像被连续下采样,直到达到某个所需的停止点。有两种常见的图像金字塔:高斯金字塔:用于对图像进行下采样拉普拉斯金字塔:用于从金字塔较低的图像(分辨率较低)重建上采样图像高斯金字塔:把金字塔想象成一组图层,层越高,尺寸越小。每一层都从下到上编号,所以层(i+1)(记作Gi+1)比层i (Gi)小。为了在高斯金字塔中生成层(i+1),我们做如下操作:1.将Gi与高斯核卷积:2.原创 2022-04-07 21:50:40 · 3179 阅读 · 0 评论 -
Halcon模板匹配——保存与加载形状模板
文章目录需求halcon 算子支持1.保存形状模板2.读取形状模板示例:1.保存形状模板2.读取加载形状模板需求做模板匹配的过程中,需要保存当前的形状模板以便后续进行读取加载。halcon 算子支持1.保存形状模板函数原型:write_shape_model( ModelID, FileName : )参数说明:ModelID:模型的句柄FileName :保存的文件名,形状模型的默认HALCON文件扩展名是’shm’。2.读取形状模板函数原型:read_shape_model(原创 2022-04-03 11:26:11 · 4966 阅读 · 0 评论 -
opencv 直方图比较
前言在中详细讲解了图像直方图,图像直方图比较是度量两张图像相似度的一种手段。为了比较两个直方图(H1和H2),首先我们必须选择一个度量(d(H1,H2))来表示这两个直方图的匹配程度。OpenCV提供了4种不同的指标来计算匹配:相关性Correlation ( HISTCMP_CORREL):N是N是直方图bin的总数。Chi-Square ( HISTCMP_CHISQR)Intersection ( method=HISTCMP_INTERSECT)Bhattacharyya dis原创 2022-04-02 00:07:20 · 3069 阅读 · 0 评论 -
opencv 图像重映射cv::remap()(图像上下、左右镜像)
文章目录概念opencv 函数支持 cv::remap()1.函数原型:2.参数说明测试代码:程序运行效果:概念什么是重映射?这是从图像中的一个位置获取像素并将它们定位到新图像中的另一个位置的过程。为了完成映射过程,可能需要对非整数像素位置进行一些插值,因为源图像和目标图像之间并不总是存在一对一的像素对应关系。我们可以表达每个像素位置的重映射( x , y)作为:其中g()是映射的图像,f()是源图像,h(x,y)是作用于(x,y)的映射函数。opencv 函数支持 cv::remap()原创 2022-04-01 00:07:26 · 2603 阅读 · 0 评论 -
halcon模板匹配 ——多个不同对象同时匹配
文章目录场景效果实现步骤1.读取图像2.分别生成两个ROI3.分别创建各向同性比例缩放形状模板4.分别获取形状模型的轮廓表示5.连接两个模板轮廓XLD6.保存模板相关信息7.读取新的图像8.搜索匹配8.对搜索到的XLD轮廓应用任仿射二维变换9.清除句柄场景需求是在一个视野里同时搜索匹配两个不同类型的对象。效果实现步骤1.读取图像read_image (ModelImage, 'rings_and_nuts')2.分别生成两个ROIgen_circle (ModelROIRing, 1原创 2022-03-20 10:19:57 · 4419 阅读 · 0 评论 -
Gabor滤波器特征提取原理讲解及c++实现
文章目录Gabor滤波器复正弦载波高斯滤波参数解释gabor滤波核实现效果:Gabor滤波器1946年,Dennis Gabor于在“Theory of communication”一文中提出了著名的“窗口”傅里叶变换(也叫短时Fourier变换,STFT),即Gabor变换。在图像处理邻域,Gabor小波是一种非常有效的纹理表示方法。在空域,一个2维的Gabor滤波器是一个正弦平面波和高斯核函数的乘积:其中s(x, y)是一个复正弦信号,称为载波,Wr(x, y)是一个二维信号高斯型函数,称原创 2022-03-19 18:56:21 · 6877 阅读 · 1 评论 -
opencv dft离散傅立叶变换
文章目录概念一、算法步骤1.将图像扩展到最佳大小2.为复数和实值开辟空间3.进行离散傅里叶变换4.将实部和复部转换为振幅5.转换到对数尺度6.裁剪和重新排列7.归一化运行效果完整代码概念傅里叶变换将图像分解成它的正和余弦分量。换句话说,它将图像从它的空间域变换到它的频域。其思想是,任何函数都可以精确地逼近无穷个正函数和余弦函数的和。傅里叶变换是一种方法。二维图像的傅里叶变换在数学上为:这里f是空间域的图像值,F是频域的图像值。变换的结果是复数。可以通过实像和复像显示,也可以通过幅值和相位图像显示。原创 2022-03-19 00:26:15 · 4899 阅读 · 0 评论 -
OpenCV 拉普拉斯边缘检测Laplacian()原理解析
文章目录前言一、opencv 函数支持1.函数原型:2.参数说明:测试代码前言在边缘区域,像素强度显示出“跳跃”或强度的高变化。得到强度的一阶导数,我们观察到边缘的特征是最大值,如图所示:如果我们取二阶导数会发生什么?您可以观察到二阶导数为零!因此,我们也可以使用这个标准来尝试检测图像中的边缘。但是,请注意,零不仅会出现在边缘(它们实际上可以出现在其他无意义的位置);这可以通过在需要的地方应用过滤来解决。拉普拉斯算子从上面的解释,我们推断二阶导数可以用来检测边缘。由于图像是“2D”,我们需原创 2022-03-17 23:55:02 · 3647 阅读 · 0 评论 -
opencv车道线检测实战
文章目录效果复现代码效果复现代码 void lane_detection(cv::Mat &src, cv::Mat &dst) { dst = cv::Mat::zeros(src.size(),src.type()); cv::Mat grid =cv::Mat::zeros(src.size(),src.type()); int iStep = 25; int iNUmsX = src.cols / iStep; int in原创 2022-03-17 14:55:39 · 1347 阅读 · 0 评论 -
Halcon模板匹配——各向同性比例缩放形状模板(超详细讲解)
文章目录需求算子函原型参数说明实例讲解效果:完整代码:需求考虑以下这张图像,图片中有三个形状一样,但是尺寸大小不一样的图案。观察可以发现三个图案的有着各项同性比例缩放的关系。假如要采样模板匹配来识别出这三个图案该怎么做?Halcon提供create_scaled_shape_model()算子来解决这种场景。算子函原型create_scaled_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Scale原创 2022-03-17 14:30:30 · 7577 阅读 · 3 评论 -
opencv 仿射变换
文章目录一、仿射变换二、求解仿射变换三、opencv 函数支持1.getAffineTransform()函数2.getRotationMatrix2D()函数3.warpAffine()函数四、测试代码一、仿射变换仿射变换可以理解为矩阵乘法(线性变换)和向量加法(平移)的变换。本质上,一个仿射变换代表了两个图像之间的关系,可以分别表示为:1.旋转(线性变换)2.翻译(向量加法)3.缩放操作(线性变换)仿射变换通常使用2×3矩阵表示:将M乘于一个二维向量[x, y],例如图像像素坐标,最终可原创 2022-03-16 21:37:54 · 6711 阅读 · 0 评论 -
opencv harris角点检测详解
文章目录概念一、角点检测原理二、opencv 函数支持 cornerHarris()概念特征提取特征提取是计算机视觉和图像处理中的一个概念。特征指的是唯一可识别的特性。特征提取是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。图像特征的类型图像特征作为标志性的属性,常见的有:边缘角点(也称为兴趣点)Blobs(也称为感兴趣的区域)本章研究一下角点一、角点检测原理角点既然是两条边原创 2022-03-16 19:22:00 · 1355 阅读 · 0 评论 -
opencv 直方图均衡化
文章目录前言一、原理opencv 函数支持equalizeHist()前言在中详细讲解了图像直方图,这章来讲解一下直方图的均衡化。直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。先看下图未经过均衡化的图像,可以看到像素似乎聚集灰度值范围的中间。直方图均衡化所做的就是扩大这个范围。在应用均衡化后一、原理均衡化意味着将一个分布(给定的直方图)映射到另一个分布(灰度值更宽、更均匀的分布),因此灰度值分布在整个范围内。为了达到均衡效果,重映射应该是累积分布。对于直方图H(i原创 2022-03-16 11:20:43 · 6172 阅读 · 0 评论 -
opencv 不支持旋转模板匹配详解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录模板匹配一、opencv 函数支持1. matchTemplate()函数2.minMaxLoc()二、代码示例:模板匹配模板匹配是一种用于查找与模板图像匹配(相似)的图像区域的技术。匹配原理:1.首先需要两张图像,一张源图像(I):我们期望在其中找到与模板图像匹配的图像,一张模板图像 (T):将与源图像进行比较的模板图像2.然后,我们的目标是检测出最匹配的区域:,将模板图像在源图像上进行滑动计算比较。从左到右,从.原创 2022-03-16 00:12:04 · 2611 阅读 · 2 评论 -
opencv 图像直方图详解
//直方图void test_Hist(){using namespace cv;cv::Mat image = cv::imread(“D:\QtProject\Opencv_Example\drawRect\drawRect.jpg”, cv::IMREAD_GRAYSCALE);if (image.empty()) {cout << “Cannot load image” << endl;return;}imshow(“image”,image);const原创 2022-03-15 22:37:01 · 8879 阅读 · 0 评论 -
opencv 改变图像的对比度、亮度和伽玛校正
文章目录概念代码实现1.遍历像素的方式2.opencv convertTo()函数3.伽玛校正4.效果演示完整代码:概念下面的解释来自Richard Szeliski的《计算机视觉:算法和应用》一书图像处理:一般的图像处理算子是一个函数,它接受一个或多个输入图像并生成一个输出图像。图像变换可以看成:1.点运算(像素变换)2.领域(基于区域)运算像素变换:1.在这种图像处理变换中,每个输出像素的值仅依赖于相应的输入像素值(可能还要加上一些全局收集的信息或参数)。2.这些操作符的例子包括亮原创 2022-03-15 00:17:42 · 3966 阅读 · 1 评论 -
opencv 混合两个图像addWeighted()函数原理解析
文章目录概念opencv函数支持cv::addWeighted()函数原型代码示例效果:概念图像混合为线性混合运算,理论公式如下:f0(x):表示图像1的像素值f1(x):表示图像2的像素值α0:表示两个图像的权重参数。值区间0-1;opencv函数支持cv::addWeighted()函数原型CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,原创 2022-03-15 00:15:34 · 1040 阅读 · 0 评论 -
opencv canny边缘检测算法详解
在1986年,Canny边缘检测算子首次在论文《A Computational Approach to Edge Detection》中提出,目前,Canny边缘检测算子已广泛应用于各种图像处理视觉系统。由于它是从不同视觉对象中提取有用的结构信息,所以了要处理的数据量大大减少。JOHN CANNY总结出,不同视觉系统对边缘检测具有较为类似的要求,所以,发现可以采用一种应用意义广泛的边缘检测技术。JOHN CANNY采用了如下步骤设计实现了canny算子。(1)消除噪声。边缘检测的算法的主要思想采用了图像原创 2022-03-14 22:17:42 · 8876 阅读 · 0 评论 -
OpenCV Tutorials(三)矩阵的掩码(或卷积)操作
文章目录前言一、像素访问方法二、filter2D 函数前言矩阵的掩码或者卷积操作非常简单。其思想是,我们根据掩码矩阵(也称为核)重新计算图像中每个像素的值。此掩码保存的值将调整相邻像素(和当前像素)对新像素值的影响程度。从数学的观点来看,我们用指定的值进行加权平均。例如我们对图像做对比度增强方法。每个像素应用下面的公式:也可以使用卷积核表示:通过将掩码矩阵的中心放在要计算的像素上并将像素值与重叠矩阵值相乘来使用掩码。和公式表示方法是相同的操作效果,但是在大型矩阵的情况下,后一种表示法更容易查看。原创 2022-03-13 14:15:36 · 2717 阅读 · 0 评论 -
OpenCV Tutorials(二) cv::Mat图像遍历和算法性能测量
文章目录如何衡量算法的性能?如何遍历每一个图像的像素?1.高效的遍历方式2. 迭代器(安全)方法3.动态地址计算 cv::Mat::at() 函数4.查找表5.四种方式性能对比总结如何衡量算法的性能?我们如何测量时间?OpenCV提供了两个简单的函数来实现cv::getTickCount()和cv::getTickFrequency()。第一个返回某个事件(比如自启动系统以来)中系统CPU的节拍数。第二个返回您的CPU在一秒内发出一个tick的次数。因此,测量两个操作之间的时间代码如下:double翻译 2022-03-12 23:10:06 · 1864 阅读 · 0 评论 -
opencv复现Halcon太阳能硅片缺陷检测例程
效果OK的:NG的:代码 int i = 1; while(1) { cv::Mat src; QString dir("D:\\QtProject\\Opencv_Example\\solar_cell\\solar_cell_"); QString path; if(i>9) path = QString("%1%2%3").arg(dir).arg(i++).arg(原创 2022-03-12 14:21:51 · 2195 阅读 · 0 评论 -
opencv 自适应二值化cv::adaptiveThreshold()函数详解(复杂背景下提取划痕)
文章目录前言一、opencv cv::adaptiveThreshold()函数1.函数原型:2.参数说明:3.函数原理:代码示例前言从以下复杂背景图片下提取划痕假设采用全局阈值二值化, cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV),很难得到最优的二值化效果,划痕没有完整提取出来,反而把背景也提取出来了:这个时候就需要一种能够自适应的二值化算法上场了。一、opencv cv::adaptiveThre原创 2022-03-06 14:10:48 · 7062 阅读 · 2 评论 -
opencv 矩形cv::Rect数据结构详解
文章目录前言一、源码二、cv::Rect的成员和属性1.成员2.属性三、代码示例四、运行效果前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。一、源码template<typename _Tp> class Rect_{public: typedef _Tp value_type; //! default constructor Rect_()原创 2022-03-05 22:30:34 · 12131 阅读 · 0 评论 -
opencv findContours()轮廓特征分析大全(求面积、周长、几何矩、质心、凸包、最小外接矩形、最小外接三角形、最小外接椭圆等)
void test_convexHull(){cv::Mat src;src = cv::imread(“D:\QtProject\Opencv_Example\convexHull\convexHull.png”, cv::IMREAD_GRAYSCALE);if (src.empty()) {cout << “Cannot load image” << endl;return;}cv::imshow(“src”, src); cv::Mat binary;原创 2022-03-05 12:25:18 · 4751 阅读 · 0 评论 -
opencv SimpleBlobDetector blob分析斑点检测原理详解
文章目录概念一、SimpleBlobDetector算法原理二、代码示例:运行效果:概念Blob是图像中具有某些共同属性(如灰度值、圆度等如下图所示属性)的一组连通像素。一、SimpleBlobDetector算法原理SimpleBlobDetector从图像中提取blobs的算法流程如下:根据阈值步距“thresholdStep”递增,从最小阈值‘minThreshold“(包含)到最大阈值maxThreshold(排除)计算几个阈值,第一个阈值minThreshold,第二个是minTh.原创 2022-03-04 22:59:18 · 7709 阅读 · 1 评论 -
Halcon Threshold()二值化函数解析与C++实现
文章目录原理一、Halcon函数原型二、C++实现原理从输入图像中选取灰度值g满足以下条件的像素:minGray < g < maxGray一、Halcon函数原型threshold(Image : Region : MinGray, MaxGray : )参数说明:Image :HImage类型,输入图像,即待分割图像。Region :HRegion类型,输出区域,即分割后的区域。MinGray :输入灰度低阈值,0~255。MaxGray :输入灰度高阈值,0~255,原创 2022-02-28 21:42:53 · 2045 阅读 · 0 评论 -
图像平滑之中值滤波(c++实现opencv medianBlur()函数)
文章目录一、概念二、opencv medianBlur()函数三、c++实现中值滤波四、自己实现中值滤波和opencv中值滤波对比一、概念中值滤波中值滤波的实现原理是把数字图像中一点的值用该点的一个区域的各个点的值的中值代替。我们将一个点的特定长度或形状的邻域称为窗口,那么对于二维图像的中值滤波,一般采用33或55的窗口进行滤波,中值滤波和均值滤波有所区别,是一种非线性滤波。二、opencv medianBlur()函数函数原型:CV_EXPORTS_W void medianBlur( Inp原创 2022-02-19 22:20:27 · 3292 阅读 · 1 评论 -
图像平滑之均值滤波(c++实现opencv blur()函数)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、概念二、opencv blur函数三、原理c++实现四、自己实现的均值滤波和opencv的均值滤波对比一、概念均值滤波是最简单的滤波器,他将K*K窗口中像素值的平均值作为输出。这种滤波器等价于图像与全部元素值为1的核函数先进性卷积。二、opencv blur函数函数原型:CV_EXPORTS_W void blur( InputArray src, OutputArray dst,原创 2022-02-19 19:06:43 · 3345 阅读 · 0 评论 -
c++ 求点到直线的距离
//计算点到直线的距离double point2LineDistance(cv::Point2d point, cv::Vec4f lineParam){ cv::Point2d qIpoint; cv::Vec4f lineVert; lineVert[0] = lineParam[1]; lineVert[1] = -lineParam[0]; lineVert[2] = point.x; lineVert[3] = point.y; get2原创 2022-02-19 10:49:39 · 5532 阅读 · 0 评论 -
c++求两条直线的交点
一、已知每条直线的两个点:cv::Point2d get2lineIPoint(cv::Point2d lineOnePt1, cv::Point2d lineOnePt2, cv::Point2d lineTwoPt1, cv::Point2d lineTwoPt2){ double x; double y; cv::Point2d result(-1,-1); double k = (lineOnePt1.y - lineOnePt2.y) / (lineOnePt1.x- lineOne原创 2022-02-18 22:14:06 · 8172 阅读 · 2 评论 -
Halcon金属表面字符提取(c++实现核心算子)
项目场景:提取金属表面字符,即获取每个字符的位置区域。图中单个字符完整性不是很好,出现断开的现象。二.解决方案:1.图像阈处理2.全局二值化3.Blob分析三.halcon代码read_image (Image, 'engraved')gray_range_rect (Image, ImageResult, 7, 7)threshold (ImageResult, Region, 128, 255)connection (Region, ConnectedRegions)sel原创 2022-02-13 14:36:41 · 2183 阅读 · 0 评论 -
C++实现大津二值化算法
文章目录一、大津算法二、原理三.算法实现步骤四.测试结果五.完整代码一、大津算法大津算法(Ostu)也称最大类间方差法。顾名思义,就使两个类别之间某个属性的方差最大的方法。在图像处理中,灰度分布均匀性作为区分图像各个区域的一种度量,背景和目标之间的灰度均值的方差越大,说明目标与背景差别越大。由于其不受图像对比度的影响,大津二值化常被用来分割目标与背景。二、原理对于一副大小RC的图像,目标和背景的分割阈值记作T,图像中像素的灰度值小于阈值T的像素个数记作N0。1.目标的像素点数占整幅图像的比例记.原创 2021-09-03 00:08:08 · 2107 阅读 · 1 评论 -
行优先与列优先遍历opencv中Mat数据类型的效率差异
文章目录一、数组在内存的存储方式二、代码示例及结果三.分析一、数组在内存的存储方式数组是数据结构的基础,之所以这么说是因为数组反映了内存的物理结构。在内存中,数组是连续分布的。而在程序中,往往要在内存中分配一块连续的空间来使用。例如,在图像处理邻域,耳熟能详的opencv中有一数据类型Mat,我们一般都会以Mat来存储图像数据。Mat是一个二维数组,可以通过两个for循环遍历图像上各个像素值。有人习惯按行优先遍历,有人喜欢按列优先遍历,表面上看,这两中写法的时间复杂度都是O(nm)(n表示图像的高,m.原创 2021-09-01 22:16:46 · 2347 阅读 · 0 评论 -
缺陷检测——Halcon表面划痕检测
项目场景:提取表面划痕缺陷解决方案:1.先对原始图像做中值滤波处理:2.局部阈值处理3.blob分析提取特征原创 2021-08-30 13:38:57 · 9908 阅读 · 1 评论