OpenCV计算机视觉学习(15) |
您所在的位置:网站首页 › 数学中的取模符号 › OpenCV计算机视觉学习(15) |
如果需要其他图像处理的文章及代码,请移步小编的GitHub地址
传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来在前面博客 OpenCV计算机视觉学习(2)——图像算术运算 &图像阈值(数值计算,掩膜mask操作,边界填充,二值化)里面已经学习了图像的数值计算,即常量加减等。但是在C++中和python使用不同的方式进行常量计算还是有一点点的区别,比如说python的numpy类型的运算符操作是取模操作,但是opencv的运算符操作却是饱和运算。当然opencv的cv2.add函数在C++和python是一致的。于是我这里将自己认为重要的点梳理一下。 1,什么是饱和运算,什么是取模运算饱和运算(Saturating Arithmetic)和取模运算(Modulo Operation)是两种不同的数学运算。 1.1 饱和运算(Saturating Arithmetic)定义:在计算机图像处理和信号处理中,饱和运算是一种处理溢出的方法。当进行某些运算(例如加法或乘法)时,结果可能会超出数据类型的表示范围,导致溢出。饱和运算就是在发生溢出时,将结果限制在数据类型的最大和最小值之间(通常是通过截断或设置上下界),而不是简单地截断或取模。 具体来说,对于无符号数据类型,饱和运算会将溢出的结果设置为该数据类型的最大值;对于有符号数据类型,饱和运算会将溢出的结果设置为该数据类型的最大正值或最小负值,以保持在有符号范围内。 示例: 在图像处理中,对于8位无符号整数(uchar)的像素值,其范围是0到255。饱和加法将确保结果在0到255之间。如果相加的结果大于255,饱和加法会将结果截断为255,类似地,如果结果小于0,饱和运算将结果设置为0。 1.2 取模运算(Modulo Operation)定义: 取模运算是指对两个整数相除,返回余数的运算。通常使用符号“%”表示。对于整数a和正整数b,a % b 的结果是一个非负整数,其大小小于b。 示例: 在图像处理中,取模运算常用于周期性的操作,如周期性的亮度变化。对于像素值的取模加法,可以将结果限制在一个范围内,例如对256取模,确保结果在0到255之间。 总体而言,饱和运算用于控制结果的范围,防止溢出,而取模运算用于获取除法的余数,通常应用于周期性的操作。在图像处理中,这两种运算都有其应用场景,具体取决于需要实现的效果。具体下面来说。 2,在图像处理中,饱和运算和取模运算的区别,联系,应用场景分别是什么?在图像处理中,饱和运算和取模运算都可以用于对图像像素值的调整,但它们的应用场景和效果略有不同。饱和运算(Saturating Arithmetic) 特点: 饱和运算主要用于防止溢出,确保结果在一个合理的范围内,通常是0到255。 对于8位无符号整数(uchar)的像素值,饱和加法会将结果限制在0到255之间,超过255的部分会被截断为255,保持在合法范围内。 应用场景: 饱和运算常用于图像亮度调整、滤波等场景,确保处理后的像素值不超出可表示的范围。取模运算(Modulo Operation) 特点: 取模运算主要用于周期性的操作,将结果限制在一个周期内,通常是对256取模,确保结果在0到255之间。 取模运算可以用于模拟周期性的光照变化、颜色循环等效果。 应用场景: 取模运算常用于需要产生循环或周期性效果的图像处理,例如通过周期性调整图像的亮度、对比度或颜色,以实现动态的视觉效果。联系: 饱和运算和取模运算都是对结果进行限制的方式,确保结果在某个特定范围内。 在某些情况下,可以结合使用这两种运算,根据具体需求综合考虑。 总体来说: 1,如果你希望避免结果溢出,使图像保持在一个可接受范围内,使用饱和运算。 2,如果你希望实现周期性的效果,例如循环的光照变化或颜色变换,使用取模运算。 3,实际应用中,饱和运算和取模运算的选择取决于具体的图像处理任务和期望的视觉效果 3,以C++和Python 的具体实例测试 3.1 python实现饱和运算和取模运算python 示例如下(以加法为例,当然你也可以测试减法,乘法等): import numpy as np # 初始化两个像素点的值 pixel_a = np.uint8([150]) need_to_add_pixel = np.uint8([120]) # 饱和运算:将数值限制在一定范围内,通常是0~255之间 # 在图像处理中,这用于确保像素不会超出表示颜色的范围,例如某个像素的计算结果超出255,则被饱和到255 # 150+120 = 270 => 255 print(cv2.add(pixel_a, need_to_add_pixel)) # 打印结果为:[[255]] # 取模运算:计算两个数相除的余数 # 在图像处理中,取模运算可以用于创建循环效果,例如在图像边缘处形成循环纹理 # 250+10 = 260 % 256 = 4 print(pixel_a + need_to_add_pixel) # 打印结果为: [14]我将python的结果和过程解释都写在代码中了,实际上确实opencv实现的常量运算是饱和运算。而运算符实现的常量运算是取模运算。下面再看C++的。 3.2 C++实现饱和运算和取模运算C++示例如下: // 创建两个单像素的Mat,像素值分别为170和190 cv::Mat pixel1(1, 1, CV_8UC1, cv::Scalar(170)); cv::Mat pixel2(1, 1, CV_8UC1, cv::Scalar(190)); // 创建两个单像素的uchar,像素值分别是200和210 uchar pixel3 = 200; uchar pixel4 = 210; std::cout |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |