19 caimouse

尚未进行身份认证

毕业于西北工业大学,在IT行业有20多年的经验。

等级
TA的排名 25

在OpenCV里学习常见问题汇编33

问题三十三:傅里叶变换——低通滤波这个问题是先把图像进行傅里叶变换,然后进行低通滤波,由于傅里叶变换之后,图像的低频集中一处,这样给我们根据频率进行滤波的机会,整个过程如下图:根据前面一个问题的例子,可以看到傅里叶变换之后,低频部分在图像的左上角,因此需要把频谱图像进行平移和对称构造,就可以得到一个中心是低频图像,要实现低通滤波就是构造一个中间为白色的掩模图像。当这个掩模与频谱图像相乘...

2020-04-06 10:08:56

在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

在OpenCV里学习常见问题汇编31

问题三十一:仿射变换(Afine Transformations)——倾斜对一个图片进行倾斜,对X轴方向进行30度倾斜,对Y轴方向进行30度倾斜,如下公式:倾斜的关键是在于对齐次坐标变换矩阵进行改变,从上面可以看到,在X轴方向的倾斜,其实是在a的位置设置一个值。而在Y轴方向的倾斜也是按2公式里的a的位置值改变。变换之前的图片对X轴和Y轴方向进行倾斜之后的图片这...

2020-04-04 10:38:40

在OpenCV里学习常见问题汇编30

问题三十:仿射变换( Afine Transformations )——旋转这个问题就是怎么样对图像进行旋转变换,有了前面的齐次坐标变换,就可以采用相同的公式:总公式是这样:这里角度A就是旋转的角度。输入的原图进行旋转30度后的图片这个例子里的代码与前面缩放是一样的代码,只是矩阵变量不一样:A = 30.theta = - np.pi * A / 1...

2020-04-03 12:06:45

在OpenCV里学习常见问题汇编29

问题二十九:仿射变换( Afine Transformations )——放大缩小这个问题与前的问题其实是一样的解决方案,就是对矩阵进行相乘,对像素所在的坐标进行变换。现在想对图像在X轴方向放大1.3倍,在Y轴上缩小0.8倍,并且进行前面的平移操作,可以根据仿射变换公式:根据这个变换公式就可以使用代码表示如下:adbc = a * d - b * cx = np.round((...

2020-04-02 11:42:16

在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

在OpenCV里学习常见问题汇编27

问题二十七:双三次插值( Bicubic Interpolation )在这里采用双三次插值实现放大图像1.5倍,它计算量要比双线性二次插值要大,不过它的效果也比双线性二次插值要好。双三次插值,英文是Bicubic interpolation。双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。双三次插值方法通常运用在一部分图像处理软件、打印机驱动程序和数码相机中,对原...

2020-03-31 10:06:23

在OpenCV里学习常见问题汇编26

问题二十六:双线性插值( Bilinear Interpolation )前面是使用近邻插值,会发现显示的效果不是很好,会有马赛克现象,为了改善这种情况。在这个问题里采用双线性插值来解决,要想理解双线性插值,先来看看一维的线性插值:一般情况之下,插值都是位于原来两个像素点之间进行,那么y1-y0等于1,x1-x0也等于1,因此,y=y0+(x-x0)。对于双线性插值时,可以用下图来表示...

2020-03-30 11:54:33

在OpenCV里学习常见问题汇编25

问题二十五:最邻近插值( Nearest-neighbor Interpolation )最近邻插值在图像放大时补充的像素取最临近的像素的值。由于方法简单,所以处理速度很快,但是放大图像画质劣化明显。使用下面的公式来进行计算:在这里我们使用a=1.5来放大图像,再进行近邻插值。原图如下:处理后图片如下:整个例子完整的代码如下:#python 3.7.4,op...

2020-03-29 21:06:21

在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

在OpenCV里学习常见问题汇编23

问题二十三:直方图均衡化( Histogram Equalization )这个问题就是对直方图进行操作,不过是全局地考虑所有元素。直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个...

2020-03-28 13:41:55

在OpenCV里学习常见问题汇编22

问题二十二:直方图操作这个问题就是对图像直方图进行一个指定的操作,比如要让图像变换之后平均值为128,标准差为52,那么就可以采用下面的公式来变换:xout = s0/s * (xin - m) + m0输入的图像如下图:最终变换为:可以后面的图像比前面的图像,对比度进行了很大的提升。它的直方图也更好了:在这里主要使用这段代码来进行变换:m0 = 12...

2020-03-27 16:39:45

在OpenCV里学习常见问题汇编21

问题二十一:直方图归一化这个问题就是进行图像灰度变换,适应人眼的变化。有些灰度图像的像素并没有分布在 [0,255] 内,而是分布在 [0,255] 的子区间内。这样的图像肉眼看上去往往不是很清晰。我们可以通过直方图归一化的方式,将它的像素分布从 [0,255] 的子区间变为 [0,255] 范围内。通过这样的方式,往往可以增加图像的清晰度。往往可以通过下面的公式来进行变换:像下面的图...

2020-03-26 18:35:39

在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

在OpenCV里学习常见问题汇编19

问题十九:LoG滤波器由于Laplace算子是通过对图像进行微分操作实现边缘检测的,所以对离散点和噪声比较敏感。于是,首先对图像进行高斯卷积滤波进行降噪处理,再采用Laplace算子进行边缘检测,就可以提高算子对噪声和离散点的鲁棒性,如此,拉普拉斯高斯算子Log(Laplace of Gaussian)就诞生了。这个滤波器的过程就是先要对高斯函数进行二阶求导,来看一下高斯函数的二维表达式:...

2020-03-24 09:31:23

能否提高std::string的效率?

在C++里,使用std::string来替代C类型的字符串,这样方便构造和删除,又可以避免C类型的错误。不过,有人说std::string在传送参数时效率低下,比C类型的指针要慢,这种情况是真实的,要改善这种情况,就需要使用C++17里的新类std::wstring_view,这样就可以避免这个问题,它提供了一个快速访问std::string类的方式。代码如下:void f(std::wst...

2020-03-23 10:55:48

在OpenCV里学习常见问题汇编18

问题十八:Emboss滤波器Emboss滤波器常用于检测图像的边缘和轮廓,能够有效地增强图像的高频信息(边缘和轮廓),并保留图像的低频信息(图像内容)。这个滤波器与前面有一点不同,就是保留了图像内容,只是对边缘进行增强,前面很多滤波器只是保留了边缘信息。因此,这个滤波器定义也不一样,如下:这个滤波器从形式上来看是对角线方向对称的,并且也是不可以拆分的滤波器。处理的图片效果如下:...

2020-03-23 09:59:41

用Python来构造串口测试程序

对于很多嵌入式工程师来说,经常需要使用各种串口来显示数据和测试,有时候需要自动化地测试命令,使用一般的串口工具就难以满足要求,这时使用Python来写串口程序,就更加方便了。因为它可以根据嵌入式系统发送出来的命令,进行不同的情况处理,可以回应不同的命令。另外也可以使用它来过滤没用的数据,比如关注特定的日志,这样就可以少花费时间。下面就来做一个串口的程序,首先使用pip安装串口模块:pip ...

2020-03-22 18:06:21

C++里怎么样让类对象删除时自动释放动态分配的内存?

经常有这样的需求,在一个类里一些成员变量需要动态地分配内存,以前是把这个成员声明为指针,然后在构造函数里指定为NULL类型,然后在析构函数里判断这个指针是否分配了内存,如果分配了就进行删除。这种方式需要人工来做,工作量有点大,能否有更加高效的,能否有偷赖的方式呢?这是有的,如下的例子:#include <memory>class widget{private: st...

2020-03-22 12:25:07

C++怎么样使用range-based for

range-based for是C++增加的一个重要特性,大大地加快写循环代码的能力,特别是智能指针,模板等对象的引用。因此,在所有项目工程里,尽量使用这种方式,不要再使用旧的方式了,具体使用的方式,可以参考下面的代码:// range-based-for.cpp// compile by using: cl /EHsc /nologo /W4#include <iostre...

2020-03-22 12:10:49

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 签到达人
    签到达人
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 阅读者勋章Lv2
    阅读者勋章Lv2
    授予在CSDN APP累计阅读博文达到7天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 1024超级勋章
    1024超级勋章
    授予原创文章总数达到1024篇的博主,感谢你对CSDN社区的贡献,CSDN与你一起成长。
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    参与《原力计划【第二季】— 学习力挑战》获得推荐的原创文章的博主
  • 博客之星-入围
    博客之星-入围
    授予每年博客之星评选结果第21-200名的用户