机器视觉入门(一)
文章平均质量分 82
工业机器视觉设计和实现
这个作者很懒,什么都没留下…
展开
-
mfcc总结,对比直方图均衡化(一)
在人脸识别中(opencv),隐藏了一个不起眼的函数,叫做直方图均衡化。搞定mfcc之后,有一天早晨起床,突然发现mfcc神似直方图均衡化,又打开吃灰的概率论和图像处理,反复研究,迈上一个台阶,终于懂了直方图均衡化。今天我们先搞定直方图均衡化,你可以看一看,mfcc是如何神似藏其中的。翻开概率论,问,已知ε的概率密度函数是φε(x),η=4*ε-1,求η的概率密度函数φη(x)。求解如下F...原创 2020-02-21 12:21:37 · 387 阅读 · 0 评论 -
mfcc总结,对比直方图均衡化(二)
再看直方图均衡化: 对比:MFCC0,原图像,以下有x=k-1. < 0>,原来的声音波形图1,Nx是图像的统计直方图,x属于【0,255】 < 1>,X...原创 2020-02-21 16:27:00 · 545 阅读 · 0 评论 -
机器视觉入门之路(六一,大用图像二值化,从静态到动态)
机器视觉里,大多处理的是灰度图像,用了很久的黑白二值化,就是好用,却不知所以然,首先悟到的,是二分法,之后再无他想。再次悟到,便是几年之后,或许是机缘巧合,对于块匹配,耿耿于怀很久了,曾经观察到的现象是这样的,目的,想让一个字“识”,分成的五部分,变成一个整体,如何做到?我首先用过的办法是,调整相机,使其对焦模糊,五部分会连起来,然后使用黑白二值化,分离出来,便是一个整体。这样的好处是...原创 2020-03-29 16:46:22 · 669 阅读 · 0 评论 -
机器视觉入门之路(六二,大用图像二值化,膨胀腐蚀初探)
我们再看这个‘识’字,门槛值在54,门槛值在80,门槛值在104,门槛值在154,如下:对比前一篇,门槛值在204,门槛值在254,从视觉来看,我们最想要的‘识’字在门槛值154附近(热起来,冷会褪去,冷起来,热会褪去,不冷不热,和的位置,不卑不亢,恰到好处)。实质,我们取像,调焦的过程,也是这样,当差分和最大时,图像最清楚,我们再看看那时的图片:图像最清楚,正对应我们...原创 2020-03-30 12:31:49 · 686 阅读 · 1 评论 -
机器视觉入门之路(六三,大用图像二值化,高斯平滑)
我们经常会用到高斯平滑,作用是使得图像中的噪点减少,这就是平滑,实质用我们的差分和一测量,差分和减小了,这实质是图像变模糊了,我更喜欢叫他高斯模糊。能使得图像变模糊,显然像素会变得块化,那么设置门槛值,就很容易分割图像里的背景,我们这里来细化高斯模糊算子的实现,然后对比一下他和隐藏在图像中的两个类别高斯分布通过门槛值的分割。虽然都有高斯,但明显不同。先看高斯模糊,一下是3*3高斯模板和要平...原创 2020-03-30 20:44:31 · 893 阅读 · 0 评论 -
机器视觉入门之路(三九--A,霍夫变换(hough transform)寻找直线,c++)
xy坐标系直线:y=kx+b请看图:假定红色线段上的所有样本点(100个)都满足上面的直线方程。(a图)也就是说,红色的点(x1,y1)(x2,y2)(x3,y3)......(x98,y98)(x99,y99)(x100,y100)带入方程,只能求出一个k值和一个b值,假定为(k1,b1)。换一种表达,在kb坐标系,(k1,b1)只是一个点。如图(仅仅示意而已):(b图)...原创 2020-05-03 16:20:59 · 873 阅读 · 0 评论 -
机器视觉入门之路(一,认识位图处理类CDib,c++)
就是这个.bmp位图,差一点把我挡在门外,所谓,万事开头难。首先只是一个处理图像的想法,那么自己先要加载一个.bmp位图,瞅一瞅吧!最初,会一点c++,知道一点.bmp位图,微软使用的图像格式。书上,网上都有处理位图的cdib类,抄的我都快哭了!下面,这是我那时删到最简单的cdib类:我们看还能否继续删除,假定我们加载一幅640*480真彩色.bmp位图,那时的30万的摄像头所保存的图片(未压缩格式,24位=3*8)。bool CDib::LoadBmp (LPCTSTR fn)//原创 2020-06-21 13:02:43 · 604 阅读 · 0 评论 -
机器视觉入门之路(二,微软的gdi+前奏,c++)
在用微软gdi+之前,有一个小插曲,我能否不用微软gdi+?答案是可以的,因为过去太久远,下午又重新测试代码(vs2013),再次确认ok,那么我们给出非gdi+方式显示.bmp位图(可以在vc6.0运行,通常vs2005及以后多用gdi+):看代码:第一,包含hdib.h,声明public: CDib m_dib;第二,在初始化函数中OnInitDialog添加: CString str; bool b; str = "c:\\自拍头像.bmp"; b = ...原创 2020-06-21 20:39:05 · 305 阅读 · 0 评论 -
机器视觉入门之路(三,微软的gdi+,c++)
自从有了微软的gdi+,界面的画图和交互简单了。我们不解释gdi+了,可以百度,我们直接示范在vs2005 c++编程中使用:第一,在stdafx.h中添加:#include <gdiplus.h>using namespace Gdiplus;第二,在你的cwinapp派生类中添加: public:GdiplusStartupInput m_GdiplusStartupInput; ULONG_PTR m_GdiplusToken;第三...原创 2020-06-22 09:32:50 · 568 阅读 · 0 评论 -
机器视觉入门之路(四,bmp数据的Z倒序处理,c++)
在cdib和gdi+的加持下,我们来处理bmp数据的Z倒序处理:我们此节解决三个问题,第一,行四位对齐;第二,翻转Z倒序;第三,24位转换32位图像。第一,声明变量在.h文件中UINT m_nPicWidth; // 当前编辑图像宽度 UINT m_nPicHeight; // 当前编辑图像高度 BYTE* m_pImageBuffer; // 编辑图像原始像素数组 ...原创 2020-06-22 10:15:59 · 286 阅读 · 0 评论 -
机器视觉入门之路(五,彩色图像转灰度图像,c++)
机器视觉为什么会使用灰度图像,看完这节,你就明白了!彩色rgb转灰度256色,有一个公式:GREY=(RED*30+GREEN*59+BLUE*11)/100;我们继续以640*480的真彩色图像为例m_nPicHeight=640;m_nPicWidth=480; m_pImageBuffer = (BYTE *)malloc(m_nPicHeight*m_nPicWidth*4);//接受灰度图像,并显示m_pImageBuffer88 = (BYTE *)malloc(m_...原创 2020-06-22 11:20:14 · 720 阅读 · 0 评论 -
机器视觉入门之路(六,图像存为bmp,c++)
旧账新算,vs2013下,首先fopen被警告,不能用(百度,可以搞定)其次,文件不能保存c系统盘,win8.1有保护(百度,可以搞定)c++走到今天,不容易啊!调试一早上,要保存着讨厌的bmp,几乎快崩溃了,崩溃的边缘,就是胜利的曙光。看代码,我们仍然用640*480的24位rgb真彩色图像(以下干掉了调色板,与前面保持一致): BITMAPFILEHEADER fh; BITMAPINFO info; memset(&fh, 0, sizeof(f...原创 2020-06-23 09:39:32 · 370 阅读 · 0 评论 -
机器视觉入门之路(七,存图像,不用bmp行不行?c++)
这讨厌的bmp,头都大了,不用,行不行?可以,tiff,gif...等等等等,哈哈,还不一样,我不想学,那么如何,不想学,又改变了呢?我们仍然用640*480真彩色24位rgb图像,看代码:我们直接把扩展名.bmp改为.孙大圣,保存文件为ganggangwa.孙大圣 FILE *fp; if ((fp = fopen((char *)(LPCTSTR)"d:\\ganggangwa.孙大圣", "wb")) == NULL) { return ; }...原创 2020-06-23 10:12:27 · 229 阅读 · 0 评论 -
机器视觉入门之路(八,一幅图太多无用,只截取关键部分,c++)
我想在640*480真彩色24位图像中关键部分画个矩形框(left,top,right,bottom=200,200,400,400),并把它截取下来保存,怎么做呢?好,我们在CDib类中,再添加函数bool CDib::Pick24Bitmap(LPCTSTR fn,DWORD xt,DWORD yt,DWORD xb,DWORD yb),显然fn是文件名(.bmp),矩形框的left,top,right,bottom=xt, yt,xb, yb那么两个for循环就搞定了,pt1=(xt, yt)原创 2020-06-23 11:01:55 · 216 阅读 · 0 评论 -
机器视觉入门之路(九,8位灰度图像的存储.bmp,c++)
前面我们针对的是真彩色图像,绕开了调色板,但是实在经不住存储空间小的诱惑,假定我们的640*480的24位图像已经变换为8位灰度图像,存放在m_pImageBuffer88 数组中,我们如何把它存入磁盘以.bmp位图方式,想看一看从前自己的样子,不容易啊!调试了一下午,vs2013下,终于及格了!看代码:RGBQUAD *m_Quad =new RGBQUAD[256]; for (int i = 0; i < 256;i++) { ...原创 2020-06-23 21:06:53 · 768 阅读 · 0 评论 -
机器视觉入门之路(十,8位灰度图像的加载显示(微软的魔法),c++对比c#)
8位图像存起来方便,显示起来是否也方便呢?显示出来让你大惊失色!我们先加载,在cdib类中增加调色板:第一,还记得(一)中最简版的cdib吗?那些删掉的和调色板相关要恢复过来第二,第三次files.read(...)之后增加代码:if(!this->CreatePalette ()) { Free(); return false; }第三,bool CDib::CreatePalette (){ if(this->m_B...原创 2020-06-23 22:09:04 · 564 阅读 · 0 评论 -
机器视觉入门之路(十一,8位灰度直方图图像,c++)
这是八位灰度图像的直方图统计:DWORD *m_pGrayBuf =new DWORD[256];memset((void*)m_pGrayBuf,0,256*sizeof(DWORD));for(y=0;y<Height;y++) { for(x=0;x<Width;x++) { m_pGrayBuf[m_dib.m_Buffer [y*Wi...原创 2020-06-24 11:57:47 · 886 阅读 · 0 评论 -
机器视觉入门之路(十二,初次接触图像放大缩小,c++)
当界面想多方几张图,有时图像太大,界面窗口放不下,就会有孙大圣绣花针的想法:void ZoomNormal(BYTE * image0,BYTE * &image1,unsigned int w,unsigned int h, unsigned int & outwidth,unsigned int & outheight,double ZoomX,double ZoomY){ outwidth=(int)(w*Zo...原创 2020-06-24 13:58:15 · 395 阅读 · 0 评论 -
机器视觉入门之路(十三,图像旋转原理,c++)
如图,我们的电脑屏幕坐标系:已知(x0,y0),以原点O(0,0)旋转,长度r不变,求旋转后的点(x,y)x0=r*cos(a);y0=r*sin(a);x=r*cos(a-)=r*cos(a)*cos()+r*sin()*sin(a)=x0*cos()+y0*sin();y=r*sin(a-)=r*sina(a)*cos()-r*cos(a)*sin()=-x0*sin()+y0*co原创 2020-06-25 10:24:26 · 414 阅读 · 0 评论 -
机器视觉入门之路(十四,图像旋转原理,c++)
接上节,如果MG直线不围绕原点O旋转,而是围绕(2,2)点旋转,该怎么办?假定M(3,4),G(5,2),那么直线MG相对(2,2)点坐标是(1,2)和(3,0)那么,以(2,2)点为原点,M(1,2)和G(3,0)旋转,利用公式:=就搞定了,要注意的是这是M(1,2)和G(3,0)针对(2,2)旋转,得到M'G',M'=;G'=那么M'G'在原点坐标系是多少呢?对了,加上(2,2)即可,+;+这就是MG围绕(2,2)点旋转后的坐标。所以点(x0,y0)原创 2020-06-25 13:01:35 · 544 阅读 · 0 评论 -
机器视觉入门之路(十五,图像旋转原理,c++)
整理一下:有关旋转:=*那么平移是否也可以:=*,保证x=x0+x,y=y0+y呢?有人发现:=,而且=*,那么自然就会有=*,所以=。好,再复习一下:点(x0,y0)围绕任一点(a,b)旋转=(x,y)公式如下:+=,即平移(x(-a),y(-b)),旋转,再平移(-x,-y)可以改为:+=,+=看上去,怪怪的,但不影响结果,有人习惯如下表达:平移,(x0,y0,1),旋转(x0,y0,1)*,再平移(x0,y0,1)*=(x,y,1)也有人喜欢如此:平原创 2020-06-25 18:20:02 · 652 阅读 · 0 评论 -
机器视觉入门之路(十六,完成图像旋转,c++)
原理已经讲完,图像旋转代码实现如下(以图像中心旋转):void RotateNormal(BYTE * image0,BYTE * &image1,unsigned int w,unsigned int h, unsigned int & outwidth,unsigned int & outheight,double angle){// 原始图像四个角的坐标 int srcX1,srcX2,srcX3,srcX4;...原创 2020-06-26 08:08:42 · 311 阅读 · 0 评论 -
机器视觉入门之路(十七,完成图像旋转(再看微软魔法!),c#)
以下是未旋转,加载的8位图像(大小,256*256),显示用24位,正常(下,左):顺便看一下怪异的8位图像(大小,256*256),显示用8位(上,右):再看一眼中心旋转后的8位图像(大小改变,362*362),显示用8位:再看一眼中心旋转后的8位图像(大小改变,362*362),显示用24位:再看一眼中心旋转后的8位图像(大小改变,362*362),显示用32位:图像中心旋转,c#代码如下(与c++保持一致)://旋转后放入picturebox2 // 原始..原创 2020-06-26 09:26:55 · 422 阅读 · 0 评论 -
机器视觉入门之路(十八,图像旋转再进一步)
我们中心旋转图像之后,屏幕坐标系想要回到笛卡尔(数学)坐标系,该怎么办(即y轴翻转,镜像翻转)?公式如下:(x,y,1)=(x,-y,1)那么,我想,(x,y,1)=(x-181,-(y-181),1)显然=,即平移和y轴镜像翻转。其实这样一翻转,我们的图像就不见了,不信你试试看:(x0,y0,1)*=(x,y,1)为什么要这么折腾?其实为我们坐标系的矩阵变换打好基础。如果你做好准备,那么我们后面不再用以下方式,诸如此类:而统一用,(x0,y0,1)...原创 2020-06-26 10:11:23 · 323 阅读 · 0 评论 -
机器视觉入门之路(十九,图像旋转之后,c#)
总结一下,对c#的gdi显示做个对比,从c#图像旋转代码中截取(c++一并带过):8位显示旋转图像:...... 24位显示旋转图像:......byte[] image1 = new byte[outwidth * outheight]; byte[] image1 = new byte[outwidth * outheight *3...原创 2020-06-26 10:51:08 · 358 阅读 · 0 评论 -
机器视觉入门之路(二十,图像旋转之后,c#)
总结图像旋转,突然发现矩阵运算(二维概念)很重要,我们应该有一个基础矩阵运算类,我们把先学会的平移,旋转,翻转引入到类中(简单就好,以后需要的功能,可再增加,一次要设计好,脑瓜疼!),你会发现,坐标系中的每一个点(x,y)需要这样的运算,图像中的每一点(i,j)也需要有这样的运算,运算前先要找到操作点,坐标系很方便,直接上(x,y),而图像,你现在知道,他就是buffer【】,是一个二维的概念,即buffer[j][i]=buffer[j*w+i],其实我们的图像处理,机器视觉都是处理的这个buffer中的原创 2020-06-27 12:39:36 · 576 阅读 · 0 评论 -
机器视觉入门之路(二一,图像旋转之后,c#)
测试代码:mg_linetestline = new mg_line(new PointF(200, 200), new PointF(400, 500)); Graphics g = e.Graphics; g.DrawLine(new Pen(Brushes.Red), testline.pt_start, testline.pt_end); testline.直线旋转(new PointF(0, 0...原创 2020-06-27 17:02:49 · 347 阅读 · 0 评论 -
机器视觉入门之路(二二,旋转矩形截取图像,c#)
我们开始尝试旋转一个矩形:先画一个矩形: mg_line testline = new mg_line(new PointF(400, 400), new PointF(400, 500)); mg_line testline1 = new mg_line(new PointF(400, 500), new PointF(600, 500)); mg_line testline2 = new mg_line(new PointF(600, 500), n...原创 2020-06-27 18:52:23 · 570 阅读 · 0 评论 -
机器视觉入门之路(二三,旋转矩形截取图像,c#)
我们尽量用最简单设计,以后不足,再增加。我们现在要搞定旋转矩形截取图像,要依靠线图像,我们对线图像使用已经炉火纯青,只是未曾用一众线图像合成图像,今天试一试,假定我们有40条线图像(最好是4位对齐,即能被4整除,其实只要我们不存储为bmp位图,其实并不受限制,其实gdi显示,也受到4位对齐的限制),我们用数组buffer【】构造新的图像,这是前面不曾有的。(尽管很少有人做,我们还是要试一试)运行如图:好,我们先把矩形39等分,要40条线,除去首尾2条线,要构造38条线。 int sepe..原创 2020-06-28 07:51:37 · 485 阅读 · 0 评论 -
机器视觉入门之路(二四,旋转矩形截取图像,c#)
加载一幅图像:好,现在取线图像40组(注意对比前头:已经调整成40组横向线图像)://glob_buffer8整幅图 List<PosAndGrey> 线图像40 = new List<PosAndGrey>(); for (int i = 0; i < 40; i++)//40条线, { PosAndGrey cc = new PosAndGrey(); ...原创 2020-06-28 14:32:29 · 478 阅读 · 0 评论 -
机器视觉入门之路(二五,橡皮筋技术(可拖拽工具),c#)
要截取一幅特征图像,进行学习匹配,经常会用到,那么我们经常会用到矩形框的鼠标拖拽行为,人们称其为橡皮筋技术,首先,我们先拖动一根线,其次再搞定其他。我们仍然遵循最轻量级代码化,以后不足,再扩充。好,走起!第一,声明一条线,并画出来,这一次,线中心多了一个小框,如下:看代码: mg_line testline4 = new mg_line(new PointF(400, 400), new PointF(600, 400));// PointF m_LineCenter = new ...原创 2020-06-29 08:53:19 · 1014 阅读 · 0 评论 -
机器视觉入门之路(二六,像素的操作(梯度图像))
图像在buffer[]中,宽度为w,高度为h。其中一个像素为buffer[i*w+j],0<=i<=h-1,0<=j<=w-1.相邻两个像素做差,Gx=math.abs(buffer[i*w+j]-buffer[i*w+j+1])Gy=math.abs(buffer[i*w+j]-buffer[(i+1)*w+j])像素buffer[i*w+j]的梯度幅值为=math.sqrt(Gx^2+Gy^2)像素buffer[i*w+j]的梯度幅值简化为=Gx+Gy原创 2020-06-30 09:45:08 · 420 阅读 · 0 评论 -
机器视觉入门之路(二七,像素的操作(高斯模板3*3产生),c#)
生成结果:代码如下: private void creategaos_Click(object sender, EventArgs e) { //////////////////////生成二维高斯滤波系数////////////////////////////////// int nWidowSize = 3; // double nSigma = 0.4; double...原创 2020-06-30 10:25:50 · 1112 阅读 · 0 评论 -
机器视觉入门之路(二八,像素的操作(拉普拉斯))
假定Gx(i,j)=buffer[i*w+j]-buffer[i*w+j+1],那么Gx(i,j+1)-Gx(i,j)=?x先求Gx(i,j+1),用(j+1)替换buffer[i*w+j]-buffer[i*w+j+1]中j,所以Gx(i,j+1)=buffer[i*w+(j+1)]-buffer[i*w+(j+1)+1]所以?x=Gx(i,j+1)-Gx(i,j)=buffer[i*w+(j+1)]-buffer[i*w+(j+1)+1]-Gx(i,j)=buffer[i*w+j+1]-原创 2020-06-30 11:24:31 · 290 阅读 · 0 评论 -
机器视觉入门之路(二九,像素的操作(sobel),c++)
一直很少用sobel,今天来看看他的效果:水平sobel处理代码:for (y = 1; y < h - 1; y++) for (x = 1; x < w - 1; x++) { n = (y*w + x) * 4; a = (-1)*image0[n - w * 4 - 4] - 2 * image0[n - w * 4] - image0[n - w * 4+4]+ image0[n + w * 4 - 4] + 2 ...原创 2020-06-30 19:37:22 · 199 阅读 · 0 评论 -
机器视觉入门之路(三十,初次图像识别(匹配的魅力))
我们已经接触了不少模板,但是有一种模板是用来匹配的,即识别到模板在图像中的位置,所以我们这里所谓的模板,实际是图像模板,你不觉得,模板也是感兴趣区域变化而来的嘛?模板在人工智能领域还有一个响亮的名字,叫做----核。比如,高斯模板被称为高斯核,诸如此类,更应该叫做算子模板。好,先看一看曾经煞费苦心的自己,虽然笨拙的现在都不用了,但匹配识别的思想精髓尽在其中:第一,加载一幅图像第二,创建roi,截取模板图像,拾取并保存。第三,加载图像,验证模板是否正确,然后执行匹配,看到那个红色的小直原创 2020-07-01 08:20:07 · 496 阅读 · 0 评论 -
机器视觉入门之路(三一,初次图像识别(匹配的魅力))
我们来看看这个模板图像匹配的思路:假定这是我们的模板图像:我们如何确定在整个图像中找到了呢?如果,图像中有一个区域与这个模板图像做差,他的绝对值最小,我们就认为找到了,写到这里,我想起平时编程中,经常会在文本中去找一段文字,差不多,就这个意思,搞定这个,再整一个文字搜索!好,步骤如下:第一,sum=79+80+81+170+77+82+172+175+75+173+174+177第二,原图像在buffer[]中,遍历图像,两个循环搞定:for(int i=0;i<heigh原创 2020-07-01 08:57:24 · 479 阅读 · 0 评论 -
机器视觉入门之路(三二,初次图像识别(匹配的魅力))
这个匹配算法能否改进一下?当然可以!我们用隔行隔列法进行匹配。即我们只用79,81,75,174来进行匹配,所以,sum=79+81+75+174for(int i=0;i<height-3;i++)//考虑边界的处理for(int j=0;j<width-4;j++){int n=i*width+j;//int m=(i+1)*width+j;int k=(i+2)*width+j;int temp=buffer[n]+0000+buffer[n+2原创 2020-07-01 09:17:47 · 289 阅读 · 0 评论 -
机器视觉入门之路(三三,经典canny边缘检测(计算机视觉里程碑))
我个人觉得,canny是麻雀虽小,但是五脏俱全的人工智能的东东,正是他,让我对图像处理产生了极大兴趣,并走上了机器视觉的道路,当然,极大的兴趣,必然伴随极大的挫折和障碍。虽然机器视觉中很少用它,但每有突破,总是不由自主想起他,回过头来,还是他最经典,他里边所蕴含的思想极具有启发性,canny不仅仅是算子,他是智能算子,他不是单一性的,他具有系统性,有恰到好处的中庸,这就是canny,了不起的canny,作为计算机视觉中一个里程碑毫不含糊,甚至可以说是人工智能领域里的里程碑!好,为了更好的理解他,我们原创 2020-07-01 16:32:19 · 425 阅读 · 0 评论 -
机器视觉入门之路(三四,经典canny边缘检测(计算机视觉里程碑))
这一节讲traceedge函数,从字面翻译,显然和边缘痕迹相关,也有人叫他染色嵌套函数,借用别人的指点,这种编程方法对图像中具有相同性质(灰度值等)的联通区域进行染色操作是很有用的。是的正是这个traceedge函数的启示,我领悟了找斑函数(findblob),因为我爷爷辈是染布的,后来自己的找斑函数就命名为染色函数,以兹纪念。网上traceedge函数的第一种表达(c++),void TraceEdge(int y, int x, int nThrLow, BYTE *pResult, int原创 2020-07-01 22:02:10 · 276 阅读 · 0 评论