caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
在OpenCV里学习常见问题汇编35
问题三十五:傅立叶变换——带通滤波前面进行高通滤波和低通滤波,如果联合这两个联波,但是中间又留出一些空间,就叫做带通滤波,有点像下面的圆环:将图像灰度化之后进行傅立叶变换并进行带通滤波,之后再用傅立叶逆变换复原。在这里,我们使用可以保留介于低频成分和高频成分之间的分量的带通滤波器。因此在这里主要难点就是构造圆环出来,采用下面的代码就可以通过两个圆半径长度不一样,进行比较就可以设置为...原创 2020-04-24 10:49:41 · 767 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编34
问题三十四:傅立叶变换——高通滤波前面一个问题,主要进行低通滤波,现在这个问题与前面一个问题刚好相反,它是禁止低频部分信息,而允许高频部分通过。高频部分在图像里就是图像的边缘像素,因为这部分像素变化比较大。因此,高通滤波是识别图像边缘的一种方法。如果理解前面的例子代码,这里就比较简单,它主要构造一个中间是黑色,周围是白色的图像,与要滤波的图像相乘。因而掩模主要代码如下:p = 0.2...原创 2020-04-12 18:35:14 · 611 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编33
问题三十三:傅里叶变换——低通滤波这个问题是先把图像进行傅里叶变换,然后进行低通滤波,由于傅里叶变换之后,图像的低频集中一处,这样给我们根据频率进行滤波的机会,整个过程如下图:根据前面一个问题的例子,可以看到傅里叶变换之后,低频部分在图像的左上角,因此需要把频谱图像进行平移和对称构造,就可以得到一个中心是低频图像,要实现低通滤波就是构造一个中间为白色的掩模图像。当这个掩模与频谱图像相乘...原创 2020-04-06 10:08:56 · 577 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编32
问题三十二:傅里叶变换(Fourier Transform)这个问题主要实现二维的傅里叶变换和逆变换。要解决这个问题,有两种方法,一种是采用Numpy里的方法来计算,另外一个是采用公式来自己实现计算。下面来看一下使用Numpy的计算方法:f_img = np.fft.fft2(gray)# 进行平移到中间位置f_img = np.fft.fftshift(f_img...原创 2020-04-05 11:14:47 · 523 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编31
问题三十一:仿射变换(Afine Transformations)——倾斜对一个图片进行倾斜,对X轴方向进行30度倾斜,对Y轴方向进行30度倾斜,如下公式:倾斜的关键是在于对齐次坐标变换矩阵进行改变,从上面可以看到,在X轴方向的倾斜,其实是在a的位置设置一个值。而在Y轴方向的倾斜也是按2公式里的a的位置值改变。变换之前的图片对X轴和Y轴方向进行倾斜之后的图片这...原创 2020-04-04 10:38:40 · 462 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编30
问题三十:仿射变换( Afine Transformations )——旋转这个问题就是怎么样对图像进行旋转变换,有了前面的齐次坐标变换,就可以采用相同的公式:总公式是这样:这里角度A就是旋转的角度。输入的原图进行旋转30度后的图片这个例子里的代码与前面缩放是一样的代码,只是矩阵变量不一样:A = 30.theta = - np.pi * A / 1...原创 2020-04-03 12:06:45 · 498 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编29
问题二十九:仿射变换( Afine Transformations )——放大缩小这个问题与前的问题其实是一样的解决方案,就是对矩阵进行相乘,对像素所在的坐标进行变换。现在想对图像在X轴方向放大1.3倍,在Y轴上缩小0.8倍,并且进行前面的平移操作,可以根据仿射变换公式:根据这个变换公式就可以使用代码表示如下:adbc = a * d - b * cx = np.round((...原创 2020-04-02 11:42:16 · 453 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编28
问题二十八:仿射变换( Afine Transformations )——平行移动这个问题要求把图像在X轴上方向移动30个像素,在Y轴上方向减少30个像素,因此这个需要使用仿射变换公式,如下:在这个公式里只是平移变换,需要把这些系数改为下面这样:其实就是变成这样:x_new = a * x + b * y + txy_new = c * x + d * y + ty...原创 2020-04-01 11:35:58 · 457 阅读 · 1 评论 -
在OpenCV里学习常见问题汇编27
问题二十七:双三次插值( Bicubic Interpolation )在这里采用双三次插值实现放大图像1.5倍,它计算量要比双线性二次插值要大,不过它的效果也比双线性二次插值要好。双三次插值,英文是Bicubic interpolation。双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。双三次插值方法通常运用在一部分图像处理软件、打印机驱动程序和数码相机中,对原...原创 2020-03-31 10:06:23 · 443 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编26
问题二十六:双线性插值( Bilinear Interpolation )前面是使用近邻插值,会发现显示的效果不是很好,会有马赛克现象,为了改善这种情况。在这个问题里采用双线性插值来解决,要想理解双线性插值,先来看看一维的线性插值:一般情况之下,插值都是位于原来两个像素点之间进行,那么y1-y0等于1,x1-x0也等于1,因此,y=y0+(x-x0)。对于双线性插值时,可以用下图来表示...原创 2020-03-30 11:54:33 · 425 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编25
问题二十五:最邻近插值( Nearest-neighbor Interpolation )最近邻插值在图像放大时补充的像素取最临近的像素的值。由于方法简单,所以处理速度很快,但是放大图像画质劣化明显。使用下面的公式来进行计算:在这里我们使用a=1.5来放大图像,再进行近邻插值。原图如下:处理后图片如下:整个例子完整的代码如下:#python 3.7.4,op...原创 2020-03-29 21:06:21 · 496 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编24
问题二十四:伽玛校正(Gamma Correction)由于照相机等电子设备传感器的非线性光电转换特性,必然导致图像的失真,为了恢复图像的原来真实的图像,采用伽玛校正对图像进行处理。可以把这个变换的公式用下面来表示:这里x为为0到1,c是常数,g为伽玛系数,通常为2.2,可以用代码表示如下:c = 1.g = 2.2out = img.copy().astype(...原创 2020-03-29 12:24:15 · 432 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编23
问题二十三:直方图均衡化( Histogram Equalization )这个问题就是对直方图进行操作,不过是全局地考虑所有元素。直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个...原创 2020-03-28 13:41:55 · 452 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编22
问题二十二:直方图操作这个问题就是对图像直方图进行一个指定的操作,比如要让图像变换之后平均值为128,标准差为52,那么就可以采用下面的公式来变换:xout = s0/s * (xin - m) + m0输入的图像如下图:最终变换为:可以后面的图像比前面的图像,对比度进行了很大的提升。它的直方图也更好了:在这里主要使用这段代码来进行变换:m0 = 12...原创 2020-03-27 16:39:45 · 460 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编21
问题二十一:直方图归一化这个问题就是进行图像灰度变换,适应人眼的变化。有些灰度图像的像素并没有分布在 [0,255] 内,而是分布在 [0,255] 的子区间内。这样的图像肉眼看上去往往不是很清晰。我们可以通过直方图归一化的方式,将它的像素分布从 [0,255] 的子区间变为 [0,255] 范围内。通过这样的方式,往往可以增加图像的清晰度。往往可以通过下面的公式来进行变换:像下面的图...原创 2020-03-26 18:35:39 · 483 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编20
问题二十:直方图这个问题,就是显示一个图片的直方图,因为直方图对一个图像的分析比较重要,它可以分析出图像的对比度,以及图像的像素分布情况。这里使用Matplotlib来画直方图非常简单的,代码只有几行:plt.hist(gray.ravel(), bins=255, rwidth=0.8, range=(0, 255))plt.savefig("out.png")plt.show(...原创 2020-03-25 16:51:31 · 480 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编19
问题十九:LoG滤波器由于Laplace算子是通过对图像进行微分操作实现边缘检测的,所以对离散点和噪声比较敏感。于是,首先对图像进行高斯卷积滤波进行降噪处理,再采用Laplace算子进行边缘检测,就可以提高算子对噪声和离散点的鲁棒性,如此,拉普拉斯高斯算子Log(Laplace of Gaussian)就诞生了。这个滤波器的过程就是先要对高斯函数进行二阶求导,来看一下高斯函数的二维表达式:...原创 2020-03-24 09:31:23 · 461 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编18
问题十八:Emboss滤波器Emboss滤波器常用于检测图像的边缘和轮廓,能够有效地增强图像的高频信息(边缘和轮廓),并保留图像的低频信息(图像内容)。这个滤波器与前面有一点不同,就是保留了图像内容,只是对边缘进行增强,前面很多滤波器只是保留了边缘信息。因此,这个滤波器定义也不一样,如下:这个滤波器从形式上来看是对角线方向对称的,并且也是不可以拆分的滤波器。处理的图片效果如下:...原创 2020-03-23 09:59:41 · 439 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编16
问题十六:Prewitt滤波器Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。在这里采用3X3的核:对图片进行处理后的效果:原图水平计算之后图片垂直计...原创 2020-03-21 09:13:15 · 458 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编15
问题十五:Sobel滤波器前面使用差分滤波器来检测边缘的特征,这种方法是来源于数学上的微积分,如果在这个基础之上,再加上正态分布,也即是高斯分布,那么就得本文里的Sobel滤波器,因此它也是用来检测图像的边缘,它的3X3的格式定义如下:使用这个核来与图像的元素进行相乘再来求和,就可以得到图像的边缘。原图水平Sobel滤波的结果垂直Sobel滤波的结果这...原创 2020-03-20 09:28:33 · 445 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编14
问题十四:差分滤波器首先我们来了解一下什么是差分滤波器,差分就是计算两个元素之差。在图像里主要指按不同的方向进行梯度运算,在离散的图像里其实就是相邻的元素进行相减的动作。差分滤波器可以用来检测图像的边缘,因为在边缘上,像素点的值与不是边缘的值差别很大。这里使用下面的差分滤波器:在这里采用了3X3的差分核,分为两个方向一个垂直方向,另一个水平方向。下面来看看这两个滤波器处理后的图片:...原创 2020-03-19 10:41:31 · 441 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编13
问题十三:MAX-MIN滤波器前面学习过均值滤波器,就是取一块窗口里数据的平均值,现在考虑一下,我们来选取这个窗口里的最大值和最小值出来,然后再用它们之间的差值来代替,这种计算方式就叫做MAX-MIN滤波。图像的细节属于低频信息,图像的边缘属于高频信息,使用一定大小的 Max-Min 滤波器作用于图像,当滤波器作用于图像细节时,输出结果往往趋向于0(黑色);而滤波器作用于图像边缘时,M...原创 2020-03-18 17:56:49 · 405 阅读 · 1 评论 -
在OpenCV里学习常见问题汇编12
问题十二:Motion Filter运动滤波一般是用在不同帧之间的视频滤波,这里主要用在同一个图像之间的滤波,比如使用下面的对角线方向上的滤波:因此在这里需要在程序上先创建一个对角线的矩阵,这个立马就可以想到使用numpy的对角线矩阵产生函数np.diag,函数的定义如下:接着来看一下经过这个滤波后的效果:原图处理后的图片在这个例子里跟前面的例子...原创 2020-03-17 08:35:59 · 618 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编11
问题十一:均值滤波器均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m m为该模板中包含当前像素在内的像素总个数。均...原创 2020-03-15 12:34:29 · 466 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编10
问题十:中值滤波(Median Filter)中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像...原创 2020-03-15 12:11:19 · 418 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编9
问题九:高斯滤波(Gaussian Filter)滤波的方法有很多种,有均值滤波,这是最简单的一种,因为认为每个元素都有相同的权限,这是最容易理解的,比如学校里使用一班学生的平均分来表示一个班的教学水平,这种方式就是计算方便,理解简单。但是并不是说这种方法就是最好的,因此有人提出中间成绩的应该有更高的级别,而考试里成绩太高和太差的,应该不一样的权限,这样更加表示了一班学生的教学水平。因此,这样...原创 2020-03-14 09:58:49 · 377 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编8
问题八:最大池化(Max Pooling)前面学习过平均池化,里面提到有多种池化的方法,其中使用比较多的是最大池化。那么什么是最大池化呢?最大池化(max-pooling)即取局部接受域中值最大的点。常用的池化方法有最大池化(max-pooling)和均值池化(mean-pooling)。根据相关理论,特征提取的误差主要来自两个方面:(1)邻域大小受限造成的估计值方差增大;(2)卷...原创 2020-03-14 09:14:47 · 483 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编7
问题七:平均池化(Average Pooling)要解决这个问题,首先要来认识池化(Pooling)这个名词,其实池化就是某一个区域里抽取一个特征值,作为这个区域的代表,不过这个选择的方式有很多种,常用的就有两种,一种是平均值,一种是最大值。池化在神经网络里经常会使用,因为池化有降维的作用,比如一个图像有几万个像素,要处理这么大的图像在神经网络里会导致计算量很大,同时可以减少特征数量,另外也可...原创 2020-03-12 16:17:57 · 329 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编6
问题六:降色处理这个问题主要把256级表示的颜色转换为4级表示,比如使用32, 96, 160, 224来表示R/G/B的颜色,转换的关系如下:val = { 32 (0 <= val < 63) 96 (63 <= val < 127) 160 (127 <= val < 191) 224...原创 2020-03-12 10:21:06 · 320 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编5
问题五:HSV变换这个问题就是要求实现RGB颜色空间转换到HSV颜色空间。HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。要从RGB转换为HSV,要使用下面的公式:通过这个算法计算之后,...原创 2020-03-12 09:10:06 · 452 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编4
问题四:大津二值化算法(Otsu's Method)大津算法,也被称作最大类间方差法,是一种可以自动确定二值化中阈值的算法。这个问题,就是根据大津的算法来实现相应的代码,因此问题的关键就是先要去理解大津法的推导过程,以及问题的定义。为了更好地理解这个算法,参考了国外的文章(http://www.labbookpages.co.uk/software/imgProc/otsuThreshold....原创 2020-03-11 11:24:08 · 373 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编3
问题三:二值化(Thresholding)把一个图像二值化表示,比如只使用黑和白来表示。而灰度图像表示也有256个级别,比如使用128作为分隔值的二值化:y = 0 if y < 128 else 255当像素灰度值小于128就设置为0,大于等于128为255。当图像二值化之后,计算的速度可以大大地提高了,并且只有两种值,这样算法也足够简单。另外对于一些动作识别并不需要颜色的...原创 2020-03-10 15:49:11 · 403 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编2
问题二:灰度化(Grayscale)在图像处理里,经常需要把彩色图像转换为灰度图像,原因何在?是因为彩色图像太复杂了,三种通道来判断边缘是比较复杂的。目前这个问题,就是怎么样把三种颜色通道图像转换为灰度,它是根据一个公式:Y = 0.2126 R + 0.7152 G + 0.0722 B这里是大多数采用的公式,当然也可以有其它的公式,那是根据不同的场合的需求来决定。比如怎...原创 2020-03-10 12:00:37 · 446 阅读 · 0 评论 -
在OpenCV里学习常见问题汇编1
在学习OpenCV里,经常会遇到一些问题,这是好事,说明平时对这些问题没有学习透,在这里把这些问题汇总到一起。尽量参考一下网上所有资源,进行一轮总结,让大家可以通过问题进行学习。这种方法是先提出问题,然后自己去思考答案,如果想出来就可以不看答案,如果想不出来就要看一下答案,这样会把自己已知的和未知的知识分开来,这样就会有重点方向了。解答这里的提出的问题请不要调用OpenCV的API,自己动手实践吧...原创 2020-03-10 11:21:15 · 512 阅读 · 0 评论 -
在OpenCV里车牌识别的方法3
前面已经学习过两种车牌识别的定位方法,现来学习第三种方法,这种方法比前面的方法更加复杂一些,还可以识别颜色出来。比如要识别下面的车牌:可以看到这个是新能源的车牌,它的背景颜色不一样,是绿色的。在这里首先读取图像输入,如下:img = cv2.imread('sznb_006.png')cv2.imshow("Original", img)接着下来进行高斯滤波,把一些细点干...原创 2020-03-08 13:01:43 · 1395 阅读 · 0 评论 -
在OpenCV里车牌识别的方法2
前面已经学了一种方法来进行车牌定位,它是通过直接把原图转换为灰度图片,就可以进行查找轮廓的方法,但是这种方法有时不起作用,就要采用另外一个方法进行识别定位。由于每个国家的车牌都是有颜色指定的,比如中国大多数小车都是蓝色车牌,那么就可以根据颜色来定位了。比如下面的车牌:可以看到车牌是蓝色为底,白色号码。自然而然就想到把蓝色换成白色,其它颜色换成黑色,这样再来查找轮廓就很容易定位车牌的位置。下...原创 2020-03-07 17:35:12 · 601 阅读 · 0 评论 -
在OpenCV里车牌识别的方法1
前面进行了手写数字的识别,自然而然就想到车牌识别,其实车牌的识别与手写数字识别是很相似的,不过它的难点是在于怎么样定位和分割车牌号出来,由于角度不同,或者车牌的颜色不同,会需要使用不同的方案。现在先来学习第一种方案,采用轮廓直接可以识别出来的方案,这个是最简单的方案。你也许会问如果这个方案识别不出来,怎么办呢?其实还可以使用别的方案,后面都一一来尝试。车牌识别往往分为下面几步:...原创 2020-03-05 17:58:29 · 1364 阅读 · 0 评论 -
在OpenCV里使用机器学习库sklearn 实现手写数字识别2
前一部分已经学习过怎么使用LinearSVC来训练手写识别的模型,并且保存在文件名称mysvm.cpickle里,接着下来就是使用这个训练的模型来进行识别,那么这个过程又是怎么样实现的呢?可以想像到,首先要把磁盘里保存的模型加载出来,然后再把要识别的图像进行与训练相同的处理,最后才可以放到模型里进行判断。在这个识别的程序开始位置,先要加入使用的库,如下:import numpy as...原创 2020-03-05 09:12:48 · 686 阅读 · 0 评论 -
在OpenCV里使用机器学习库sklearn 实现手写数字识别1
前面学习过KNN的方式来实现手写数字识别,不过效果一般,那么有没有别的方法来试一试,或许可以改进一点呢。在本文里将要介绍使用SVM和HOG的方式来实现手写数字识别,比如最终结果如下图:在这个例子里与前面《在OpenCV里用kNN实现手写数字识别》大体流程是一样的,主要区别在于这里采用skimage、sklearn库的功能,使用LinearSVC来进行训练和识别分类。因此在学习本文之前,先要...原创 2020-03-03 16:03:11 · 812 阅读 · 1 评论 -
在OpenCV里用kNN实现手写数字识别
在前面已经学习过怎么让kNN训练识别数字,并且进行了测试,如果你想不起的话,可以参考下文:《在OpenCV里用kNN实现MNIST》https://blog.csdn.net/caimouse/article/details/104227344有很多人问我,怎么样才可以把kNN算法使用起来,做一个实验之类的,因此本文就做这方面的探讨,首先自己手写一张数字图片,如下:然后用手...原创 2020-03-01 20:54:42 · 781 阅读 · 0 评论