利用opencv提取Hu不变量特征 形状匹配 机器学习识别手写数字 傅里叶变换_henreash的博客-CSDN博客


本站和网页 https://blog.csdn.net/henreash/article/details/7981806 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

利用opencv提取Hu不变量特征 形状匹配 机器学习识别手写数字 傅里叶变换_henreash的博客-CSDN博客
利用opencv提取Hu不变量特征 形状匹配 机器学习识别手写数字 傅里叶变换
henreash
于 2012-09-15 12:15:08 发布
8173
收藏
分类专栏:
OpenCV
C/C++
文章标签:
图像处理
fp
byte
存储
image
算法
OpenCV
同时被 2 个专栏收录
3 篇文章
1 订阅
订阅专栏
C/C++
29 篇文章
0 订阅
订阅专栏
void GetHu(string image_path)  
{      IplImage *src_image = cvLoadImage(image_path.c_str(),0);        CvMoments moments;      CvHuMoments hu_moments;      cvMoments(src_image, &moments,0);      cvGetHuMoments(&moments, &hu_moments);      for(int i = 1; i < 8; ++i)      {          cout<<((double*)&hu_moments)[i]<<"\t";      }  }  
void GetHu(string image_path)
IplImage *src_image = cvLoadImage(image_path.c_str(),0);
CvMoments moments;
CvHuMoments hu_moments;
cvMoments(src_image, &moments,0);
cvGetHuMoments(&moments, &hu_moments);
for(int i = 1; i < 8; ++i)
cout<<((double*)&hu_moments)[i]<<"\t";
另外,opencv中的cvMatchShapes()方法可以直接实现两个轮廓的相似性计算,结果越小越相似。这个函数也是基于Hu不变量的相似性匹配。
OpenCV中的 KNN法 即 K最近邻法 K-Nearest Neighbors
k-
最近邻是一个非常简单的机器学习算法,
并且在OpenCV
中已经实现。在这篇文章中,我们将使用免费的数据集中的手写数字,作为K
最近算法的训练集。训练之后通过它来识别数字。我们将用到一些文件操作,如:fopen,fread,etc.
如果你对文件操作不熟悉,建议先复习一下。
手写数字数据集
这个网页
http://yann.lecun.com/exdb/mnist/提供了大量的手写数据集供下载。把上面的4个文件都下载下来。这些文件包含训练图像,训练图像的标号,测试图像和测试图像对应的真实标号。文件不能通过一般的图像浏览器打开。我们必须自己写代码来读取图像和标号。
训练:加载数据集
我们使用C/C++中的标准文件操作来加载数据集。数据的在文件中的存储格式在Yann的网页中有介绍。
在图片文件中,前16个字节包含的是文件信息。其中,开头的4个字节是magic number,用来确保所读的文件正确。接下来的4个字节代表图像的数量(因为整型通常4个字节表示)。第8-12个字节代表行数,最后4个字节代表列数。之后存储的就是图像数据,逐行存储每一副图像的像素点。
在标号文件中,前4个字节同样是magic number。接下来的4个字节是标号的个数。再之后,一个标号用一个字节表示,来代表手写体对应的数字0~9中的一个。
有了对文件格式的理解,我们开始创建一个新工程,要包含OpenCV的头文件。
#include<cv.h>
#include<highgui.h>
#include<ml.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
using namespace cv;
int main()
   return 0;
我将会使用到OpenCV的C++接口,因此也包含了CV命名空间。首先,我们创建2个新的文件指针:
   int main()
    {
        FILE *fp = fopen("C:
\\train-images.idx3-ubyte", "rb");
         FILE *fp2 = fopen("C:
\\train-labels.idx1-ubyte", "rb");
        return 0;
    }
上面的语句以二进制只读的方式打开文件。然后就是异常处理语句,如果文件没有打开,我们直接返回。
if(!fp || !fp2)
   return0;
接下来,从这两个文件中读取参数:
    int magicNumber =readFlippedInteger(fp);
    int numImages =readFlippedInteger(fp);
    int numRows =readFlippedInteger(fp);
    int numCols =readFlippedInteger(fp);
fseek(fp2, 0x08, SEEK_SET);
我们一会儿会用到readFlippedInteger函数。如果你使用的是Intel的机子(以低字节优先排列)的话,就要用到这个函数。如果你使用的是高字节优先的处理器,就可以直接使用fread函数。
标号从第8个字节开始,在fp2文件中同样需要跳过开始的2个整数。
现在,我们申请空间来存储所有的图片和标号:
int size = numRows*numCols;
    CvMat *trainingVectors =cvCreateMat(numImages, size, CV_32FC1);
CvMat *trainingLabels = cvCreateMat(numImages,1, CV_32FC1);
其中“vectors”代表所有手写数字图像,即K-最近邻的输入向量,“Labels”则代表手写数据的标号,即K-最近邻的分类类别。分配好内存之后,就能从文件中读取数据了:
   BYTE *temp = new BYTE[size];
    BYTEtempClass=0;
    for(inti=0;i<numImages;i++)
    {
        fread((void*)temp,size, 1, fp);
       fread((void*)(&tempClass), sizeof(BYTE), 1, fp2);
       trainingLabels->data.fl
= tempClass;
        for(intk=0;k<size;k++)
           trainingVectors->data.fl[i*size+k] = temp[k];
这段代码加载第i副图像到temp,并且读取他的标号到tempClass.然后,在trainningVectors和trainingLabels矩阵中依次填充元素值。为什么要这样做呢?因为矩阵的数据类型是浮点型。而文件中的数据是单个字节数据。4个字节对应一个字节
是不能匹配的。所以就采用逐个数据的方式对矩阵赋值。如果你知道更好的方法,可以告诉我。
将数据存入内存之后,我们可以将它们作为输入导入到K-最近邻算法中:
KNearest knn(trainingVectors,trainingLabels);
然后,打印出k的最大值,关闭文件。
printf("Maximum k: %d
\n",knn.get_max_k());  
    fclose(fp);
fclose(fp2);
我们也可以释放矩阵,因为OpenCV中的K-最近邻算法会自己另外保存一份向量和类别的备份。
   cvReleaseMat(&trainingVectors);
cvReleaseMat(&trainingLabels);
测试:使用K-最近邻识别
训练完成之后,就要对测试图像进行测试,来看看识别的准确性。
在同一个工程下,在底部添加下面代码:
fp = fopen("C:
\\t10k-images.idx3-ubyte","rb");
fp2 = fopen("C:
\\t10k-labels.idx1-ubyte","rb");
然后,从文件中读取初始信息,并且设置fp2的文件指针到第8个字节:
magicNumber = readFlippedInteger(fp);
    numImages =readFlippedInteger(fp);
    numRows =readFlippedInteger(fp);
    numCols =readFlippedInteger(fp);  
fseek(fp2, 0x08, SEEK_SET);
接下来,为测试图像和图像类别(标号)分配内存:
CvMat *testVectors = cvCreateMat(numImages, size,CV_32FC1);
    CvMat*testLabels = cvCreateMat(numImages, 1, CV_32FC1);
CvMat *actualLabels = cvCreateMat(numImages, 1,CV_32FC1);
testVectors存储测试图像,testLavels存储通过算法预测的图像的标号,actualLabels存储实际的标号(也就是从fp2中读取的真实标号);
然后,创建一些临时变量:
   temp = new BYTE[size];
    tempClass=1;
    CvMat*currentTest = cvCreateMat(1, size, CV_32FC1);
    CvMat*currentLabel = cvCreateMat(1, 1, CV_32FC1);
int totalCorrect=0;
temp和tempClass存储当前图像和它真实的标号。totalCorrect对正确的预测进行跟踪。现在,我们迭代文件中的所有图像:
for(int i=0;i<numImages;i++)
    {
       fread((void*)temp, size, 1, fp);
       fread((void*)(&tempClass), sizeof(BYTE), 1, fp2);
       actualLabels->data.fl = (float)tempClass;
        for(intk=0;k<size;k++)
        {
           testVectors->data.fl[i*size+k] = temp[k];
           currentTest->data.fl[k] = temp[k];
     }
这段代码仅仅是读取一副图像并存储数据到矩阵。接下来还要在外面的for循环中添加如下代码来预测这幅图像的标号:
        knn.find_nearest(currentTest,5, currentLabel);
        testLabels->data.fl =currentLabel->data.fl[0];
       if(currentLabel->data.fl[0]==actualLabels->data.fl)
           totalCorrect++;
最后,打印出识别正确的数字的个数:
printf("Time: %d
\nAccuracy: %f
\n\n",(int)time, (double) totalCorrect*100/(double)numImages);
return 0;
整数的翻转和字节存储次序
不同的处理器有不同的字节存储次序。假设一个整数32个比特,那么就要用4个字节来存储。一些处理器将4个字节中最低位作为整数的最高有效位,另外一些则把最高位作为整数的最高有效位。这样的差异确实容易混淆,但是我们也无法控制。也许,MINST数据集的创建有非Intel的机器,所以才设计了这样的文件存储格式。以下是读取“flipped 整数”的方法:
int readFlippedInteger(FILE *fp)
    int ret = 0;
    BYTE *temp;
    temp = (BYTE*)(&ret);
    fread(&temp[3], sizeof(BYTE), 1, fp);
    fread(&temp[2], sizeof(BYTE), 1, fp);
    fread(&temp[1], sizeof(BYTE), 1, fp);
    fread(&temp[0], sizeof(BYTE), 1, fp);
    return ret;
这段代码中创建了一个字节指针来指向整数ret的首地址,然后从高位挨着读取4个字节,最后返回整数ret。
结束
通过以上的方法,就实现了机器学习。当然,还有一些更好的分类方法可供选择,你也可以尝试。或者你可以改进一下K-最近邻算法(提示:也许不是图像中的所有像素点都有用)。试试吧!
图像处理的傅里叶变换  
傅立叶变换在图像处理中有非常非常的作用。因为不仅傅立叶分析涉及图像处理的很多方面,傅立叶的改进算法,
比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。
印象中,傅立叶变换在图像处理以下几个话题都有重要作用: 1.图像增强与图像去噪 绝大部分噪音都是图像的高频分量,通过低通滤波器来滤除高频——噪声;  边缘也是图像的高频分量,可以通过添加高频分量来增强原始图像的边缘; 2.图像分割之边缘检测 提取图像高频分量 3.图像特征提取: 形状特征:傅里叶描述子 纹理特征:直接通过傅里叶系数来计算纹理特征 其他特征:将提取的特征值进行傅里叶变换来使特征具有平移、伸缩、旋转不变性 4.图像压缩 可以直接通过傅里叶系数来压缩数据;常用的离散余弦变换是傅立叶变换的实变换;
傅立叶变换 傅里叶变换是将时域信号分解为不同频率的正弦信号或余弦函数叠加之和。连续情况下要求原始信号在一个周期内满足绝对可积条件。离散情况下,傅里叶变换一定存在。冈萨雷斯版<图像处理>里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定。傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样,傅立叶变换使我们能通过频率成分来分析一个函数。 傅立叶变换有很多优良的性质。比如线性,对称性(可以用在计算信号的傅里叶变换里面);
时移性:函数在时域中的时移,对应于其在频率域中附加产生的相移,而幅度频谱则保持不变;
频移性:函数在时域中乘以e^jwt,可以使整个频谱搬移w。这个也叫调制定理,通讯里面信号的频分复用需要用到这个特性(将不同的信号调制到不同的频段上同时传输); 卷积定理:时域卷积等于频域乘积;时域乘积等于频域卷积(附加一个系数)。(图像处理里面这个是个重点)
信号在频率域的表现 在频域中,频率越大说明原始信号变化速度越快;频率越小说明原始信号越平缓。当频率为0时,表示直流信号,没有变化。因此,频率的大小反应了信号的变化快慢。高频分量解释信号的突变部分,而低频分量决定信号的整体形象。 在图像处理中,频域反应了图像在空域灰度变化剧烈程度,也就是图像灰度的变化速度,也就是图像的梯度大小。对图像而言,图像的边缘部分是突变部分,变化较快,因此反应在频域上是高频分量;图像的噪声大部分情况下是高频部分;图像平缓变化部分则为低频分量。也就是说,傅立叶变换提供另外一个角度来观察图像,可以将图像从灰度分布转化到频率分布上来观察图像的特征。书面一点说就是,傅里叶变换提供了一条从空域到频率自由转换的途径。对图像处理而言,以下概念非常的重要:
图像高频分量:图像突变部分;在某些情况下指图像边缘信息,某些情况下指噪声,更多是两者的混合; 低频分量:图像变化平缓的部分,也就是图像轮廓信息 高通滤波器:让图像使低频分量抑制,高频分量通过 低通滤波器:与高通相反,让图像使高频分量抑制,低频分量通过 带通滤波器:使图像在某一部分的频率信息通过,其他过低或过高都抑制 还有个带阻滤波器,是带通的反。
模板运算与卷积定理 在时域内做模板运算,实际上就是对图像进行卷积。模板运算是图像处理一个很重要的处理过程,很多图像处理过程,比如增强/去噪(这两个分不清楚),边缘检测中普遍用到。根据卷积定理,时域卷积等价与频域乘积。因此,在时域内对图像做模板运算就等效于在频域内对图像做滤波处理。 比如说一个均值模板,其频域响应为一个低通滤波器;在时域内对图像作均值滤波就等效于在频域内对图像用均值模板的频域响应对图像的频域响应作一个低通滤波。
图像去噪 图像去噪就是压制图像的噪音部分。因此,如果噪音是高频额,从频域的角度来看,就是需要用一个低通滤波器对图像进行处理。通过低通滤波器可以抑制图像的高频分量。但是这种情况下常常会造成边缘信息的抑制。常见的去噪模板有均值模板,高斯模板等。这两种滤波器都是在局部区域抑制图像的高频分量,模糊图像边缘的同时也抑制了噪声。还有一种非线性滤波-中值滤波器。中值滤波器对脉冲型噪声有很好的去掉。因为脉冲点都是突变的点,排序以后输出中值,那么那些最大点和最小点就可以去掉了。中值滤波对高斯噪音效果较差。
椒盐噪声:对于椒盐采用中值滤波可以很好的去除。用均值也可以取得一定的效果,但是会引起边缘的模糊。 高斯白噪声:白噪音在整个频域的都有分布,好像比较困难。 冈萨雷斯版图像处理P185:算术均值滤波器和几何均值滤波器(尤其是后者)更适合于处理高斯或者均匀的随机噪声。谐波均值滤波器更适合于处理脉冲噪声。
图像增强 有时候感觉图像增强与图像去噪是一对矛盾的过程,图像增强经常是需要增强图像的边缘,以获得更好的显示效果,这就需要增加图像的高频分量。而图像去噪是为了消除图像的噪音,也就是需要抑制高频分量。有时候这两个又是指类似的事情。比如说,消除噪音的同时图像的显示效果显著的提升了,那么,这时候就是同样的意思了。 常见的图像增强方法有对比度拉伸,直方图均衡化,图像锐化等。前面两个是在空域进行基于像素点的变换,后面一个是在频域处理。我理解的锐化就是直接在图像上加上图像高通滤波后的分量,也就是图像的边缘效果。对比度拉伸和直方图均衡化都是为了提高图像的对比度,也就是使图像看起来差异更明显一些,我想,经过这样的处理以后,图像也应该增强了图像的高频分量,使得图像的细节上差异更大。同时也引入了一些噪音。
  冈萨雷斯版<图像处理>里面的解释非常形象:一个恰当的比喻是将傅里叶变换比作一个玻璃棱镜。棱镜是可以将光分解为不同颜色的物理仪器,每个成分的颜色由波长(或频率)来决定。 傅里叶变换可以看作是数学上的棱镜,将函数基于频率分解为不同的成分。当我们考虑光时,讨论它的光谱或频率谱。同样, 傅立叶变换使我们能通过频率成分来分析一个函数。 图像傅立叶变换的物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数 傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由z=f(x,y)来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维空间中的对应关系。为什么要提梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,当然频谱图上的各点与图像上各点并不存在一一对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅立叶变换后的频谱图,也叫功率图,我们首先就可以看出,图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰,一副带有正弦干扰,移频到原点的频谱图上可以看出除了中心以外还存在以某一点为中心,对称分布的亮点集合,这个集合就是干扰噪音产生的,这时可以很直观的通过在该位置放置带阻滤波器消除干扰 另外我还想说明以下几点: 1、图像经过二维傅立叶变换后,其变换系数矩阵表明: 若变换矩阵Fn原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅立叶变换矩阵Fn的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。 2 、变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)
henreash
关注
关注
点赞
收藏
评论
利用opencv提取Hu不变量特征 形状匹配 机器学习识别手写数字 傅里叶变换
void GetHu(string image_path)  {      IplImage *src_image = cvLoadImage(image_path.c_str(),0);        CvMoments moments;      CvHuMoments hu_moments;      cvMoments(src_image, &moments,0);
复制链接
扫一扫
专栏目录
OpenCv中matchShapes()函数的使用
czsnooker的博客
01-26
1万+
cv::matchShapes()函数的使用
在老版本的OpenCV中,该函数的原型为cvMatchShapes(),其使用方法可以参考博客:https://blog.csdn.net/hhy018/article/details/39080947
在OpenCv3及以上的版本中保留了cvMatchShapes()函数;但这里主要介绍与其功能一样的matchShapes()函数,相比与之前的版本,...
图像分析之计算常见矩不变量,Hu矩,小波矩,Zernike矩阵
03-08
使用C计算图像的矩不变量,包括Hu矩,小波矩,Zernike矩阵
评论 1
您还未登录,请先
登录
后发表或查看评论
Hu矩的形状特征提取---matlab实现
muli
08-13
7234
利用 Hu矩 的七个不变矩作为形状特征向量–matlab实现
参考博客:https://blog.csdn.net/kcsdnprac/article/details/54954543
对其图像预处理有所改进
原理请参考博客:https://blog.csdn.net/tercel_zhang/article/details/80401052
%***********************...
机器学习图像特征提取—Hu矩(Hu不变矩)原理及代码
weixin_42795788的博客
04-13
3420
目录
1 矩的概念
2 Hu不变矩
3 利用opencv-python计算Hu矩
1 矩的概念
图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(图像描述量)来描述整个图像,这组数据越简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰。图像识别发展几十年,不断有新的特征提出,而图像不变矩就是其中一个。
矩是概率与统计中的一个概念,是随机变量的一种数字特征。设X为随机变量,c为常数,k为正整数。则量E[(x−c)k]称为X关于c点的k阶矩。...
图像特征(二)——形状特征(主轮廓特征、区域特征、图像的矩及Hu矩)
热门推荐
gloria_iris的博客
03-29
1万+
转载请注明出处https://mp.csdn.net/console/editor/html/105172749
接续上一节内容(颜色特征),本文主要介绍形状特征,并给出matlab上实现的demo。
形状特征
形状特征有两类表示方法,一类是轮廓特征,一类是区域特征。图像的轮廓特征主要针对物体的外边界;而图像的区域特征则关系到整个形状区域。下面将介绍几种典型的形状特征描述方...
OpenCV每日函数 结构分析和形状描述符(6) 计算多边形的矩和MatchShapes函数
学以致用 知行合一
01-30
1768
矩函数在图像分析中有着广泛的应用,如模式识别、目标分类、目标识别与方位估计、图像的编码与重构等。从一幅图像计算出来的矩集,不仅可以描述图像形状的全局特征,而且可以提供大量关于该图像不同的几何特征信息,如大小,位置、方向和形状等。图像矩这种描述能力广泛应用于各种图像处理、计算机视觉和机器人技术领域的目标识别与方位估计中。
一阶矩:与形状有关;
二阶矩:显示曲线围绕直线平均值的扩展程度;
三阶矩:关于平均值的对称性测量;由二阶矩和三阶矩可以导出7个不变矩。......
Opencv之利用matchshape算子实现简单的形状匹配
Kevin_Sun777的博客
12-19
4535
Opencv之利用matchshape算子实现简单的形状匹配
【PyTorch深度学习实践】学习笔记 第九节 实践篇 手写数字图像多分类
weixin_41469023的博客
02-19
850
课程链接PyTorch深度学习实践第九节课程。
go go go~!
原理介绍
在前面第六讲时,介绍过了可以将逻辑回归看做是仅含有一层神经元的单层的神经网络。一般用于二分类网络,线性可分的情况时是一个线性模型,激活函数为Sigmoid。
在这里将引入更加令人激动的概念——多分类softmax分类器、交叉熵、通道等。
1、 在二分类时,为了映射到0-1时,在线性模型输出后加了激活函数。而softmax的输入不需要再做非线性变换,也就是说softmax之前的不再需要激活函数(这里用的relu ,可见Si
opencv matchShapes()
sz76211822的专栏
05-17
4234
First you will need to get contours of shapes from image. For example use Canny() to find edges in images. Than use findContours() on image of edges to get contours.
Than you can use matchShapes()
opencv计算两个轮廓之间hu矩相似程度,MatchShapes
Jiake_Yang的博客
09-19
1万+
OPENCV提供了输入图像直接进行hu矩匹配的函数,返回的是两个图像或轮廓之间hu矩的相似度:
double cvMatchShapes(const void*object1,const void*object2,int method,doubleparameter=0);
计算两个轮廓之间hu矩相似程度:
#include
#include "cv.h"
#include
OpenCV学习笔记
cmh0221的博客
11-22
493
文章目录OpenCV基本操作读取图像显示图像保存图像waitKey()创建窗口销毁窗口图像处理基础item()itemset()通道拆分通道合并获取图像属性图像运算加法运算图像加权和按位逻辑运算位平面分解图像加密与解密数字水印色彩空间类型转换cv2.cvtColor()cv2.inRange(img, min, max)HSV色彩空间BGRA色彩空间几何变换缩放翻转仿射透视重映射阈值处理threshold()adaptiveThreshold()Otsu处理图像平滑处理均值滤波方框滤波高斯滤波中值滤波双边滤
OpenCV-图像轮廓一
h6111的博客
06-02
217
图像轮廓的概念
边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,我们能够获取目标图像的大小、位置、方向等信息。
轮廓是一系列相连的点组成的曲线,代表了物体的基本外形,相对于边缘,轮廓是连续的,边缘并不全部连续。
查找并绘制轮廊
一个轮廊对应着一系列的点,这些点以某种方式表示图像中的一条曲线。在OpenCV中,函数cv2.findContours()用于查找图像的
OpenCV 图像轮廓
weixin_57556081的博客
06-30
334
边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。
图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,我们能够获取目标图像的大小、位置、方向等信息。
1.查找轮廓
寻找轮廓的操作一般用于二值化图,所以通常会使用阈值分割或Canny边缘检测先得到二值图。
函数cv2.findContours()的语法格式为:
contours,hierarchy=cv2.findContours(image,mode,me
OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()
最新发布
小菜鸡的小博客
04-19
2687
OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()
目录OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()1. 凸性缺陷2. 点多边形测试3. 形状匹配4. 轮廓分层与cv.findContours()4.1 轮廓分层与cv.findcontours()的关系4.2 轮廓检索模式(四种参数)
1. 凸性缺陷
一般来说凸曲线都是凸出或平坦的曲线,如
【FFT夯实基础系列】手写笔记合集|傅里叶级数、傅里叶变换
kodoshinichi的博客
03-24
2055
傅里叶级数的三角和复数形式|三角函数的正交性|复数基的性质|离散傅里叶变换的理解与推导|手写笔记
Opencv计算机视觉实战(Python版)
01-22
<p>
<br />
</p>
<p>
Opencv计算机视觉实战课程旨在帮助大家快速掌握机器视觉领域必备知识点原理及其在Opencv中的使用方法。课程风格通俗易懂,用最接地气的方式来讲解晦涩难懂的知识点。整体设计以项目实战来驱动学习,课程中所有代码均使用Python完成,在实战中首先讲解整体解决方案,接下来通过Debug模式来一步步分析每一行代码的作用及其完成的效果,提供全部课件及项目中所使用代码和数据。
</p>
python-opencv利用cv2.matchShapes()实现轮廓匹配
HarryXu的博客
01-08
5699
之前用过cv2.matchTemplate()去做模板匹配,今天学习下cv2.matchShapes()
具体的使用方法,可以参考博客:https://www.cnblogs.com/wojianxin/p/12607948.html
这里我的理解是:
cv2.matchShapes()是用来匹配轮廓形状的,而且只能匹配单个轮廓;
cv2.matchTemplate()是用来匹配模板的,可以用一个模板去匹配图像上多个轮廓点对
# 一般用来分析cv.findContours()之后的轮廓点对
def
hu不变矩--python
明月清風
06-08
5182
由于网上关于Hu矩的定义的内容较多,代码实现部分又多为matlab、C++或者opencv等,因此本文将主要介绍如何用python实现Hu矩的提取。后续可能会利用Hu矩进行图片分类以及平移、旋转不变性的实验,有时间做的话到时候会放上来结果。
本篇博客内容参考图像的七个不变矩 可用于图像的匹配中的matlab代码,在其基础上进行修改而成。
#-*-coding:utf-8-*-
import...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
henreash
CSDN认证博客专家
CSDN认证企业博客
码龄19年
暂无认证
196
原创
1万+
周排名
92万+
总排名
166万+
访问
等级
1万+
积分
916
粉丝
190
获赞
251
评论
591
收藏
私信
关注
热门文章
QML编程入门
85439
QML范例详解
38237
QML数据模型(Model)
28817
C#中跨线程访问控件问题解决方案
25885
Boost.Asio技术文档
25072
分类专栏
mqtt
1篇
webassembly
2篇
flutter
2篇
tensorflow\keras
9篇
C++与QT
10篇
ReactiveX
7篇
ASTA中文文档
C#_Remoting
12篇
C#特性
27篇
Data Abstract文档翻译
27篇
Delphi
81篇
ER/Studio
3篇
Erlang语言程序设计
5篇
Hydra
1篇
Linux/Unix
7篇
Oracle
7篇
RemObjects技术白皮书
2篇
RemOjbects文档翻译
48篇
SQL Server2005
8篇
SQLDirect
TCP IP详解
2篇
操作系统
3篇
游戏开发
2篇
证券基础
4篇
跨平台-QT
46篇
Asp.net Mvc 前端技术
6篇
FireBird
11篇
C/C++
29篇
Qt QuickQML
14篇
OpenCV
3篇
人生思考
1篇
java
5篇
Xamarin
14篇
Erlang
Hadoop
1篇
Python
6篇
Asp.net
1篇
Node.js
5篇
angular
9篇
ReactiveX
13篇
go
13篇
最新评论
【深度学习】语义分割网络介绍对比-FCN,SegNet,U-net DeconvNet
JJ en:
怎么解释fcn需要三次训练,而unet只需要一次,他俩都只需要一次才对吧
labelme标注图像分割(语义分割)样本
qq_43160894:
肯定手动呀
Angular7设置Input的disabled属性
仟白:
所以这个警告我在ts里不修改怎么关掉 我觉得数组写法很不错
自动表单生成工具说明(后端、桌面、web、移动端)
qq_49820067:
求源码,谢谢
991050040@qq.com
自动表单生成工具说明(后端、桌面、web、移动端)
天原一号:
请问一下,你这个工具在GITHUB上已经取消了吗,现在下载不到了,能共享一份给我吗?gdzhou@qq.com
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Win10性能计数器缺失恢复
C#调用Rust dll测试
rust环境设置
2022年2篇
2021年5篇
2020年8篇
2019年24篇
2018年37篇
2017年10篇
2016年3篇
2015年15篇
2014年22篇
2013年8篇
2012年77篇
2011年27篇
2010年11篇
2009年36篇
2008年129篇
2006年1篇
目录
目录
分类专栏
mqtt
1篇
webassembly
2篇
flutter
2篇
tensorflow\keras
9篇
C++与QT
10篇
ReactiveX
7篇
ASTA中文文档
C#_Remoting
12篇
C#特性
27篇
Data Abstract文档翻译
27篇
Delphi
81篇
ER/Studio
3篇
Erlang语言程序设计
5篇
Hydra
1篇
Linux/Unix
7篇
Oracle
7篇
RemObjects技术白皮书
2篇
RemOjbects文档翻译
48篇
SQL Server2005
8篇
SQLDirect
TCP IP详解
2篇
操作系统
3篇
游戏开发
2篇
证券基础
4篇
跨平台-QT
46篇
Asp.net Mvc 前端技术
6篇
FireBird
11篇
C/C++
29篇
Qt QuickQML
14篇
OpenCV
3篇
人生思考
1篇
java
5篇
Xamarin
14篇
Erlang
Hadoop
1篇
Python
6篇
Asp.net
1篇
Node.js
5篇
angular
9篇
ReactiveX
13篇
go
13篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值