背景:今天我一个朋友问题,Halcon和OpenCV的全局阈值函数threshold实现结果不一样,怎么办?
是不一样啊,看看参数和原理自己改一个就行了(开玩笑的,别见怪)。
Halcon中的threshold函数定义如下,提取低阈值和高阈值之间的灰度值
而OpenCV的threshold函数一般是给定一个阈值,对超过或者低于这个阈值的像素进行处理,具体公式如下:
简单来说,Halcon的threshold函数是获取区间[a, b]之间的灰度值,OpenCV的threshold只能针对大于或者小于a或者b的灰度值处理,一个是双阈值,一个是单阈值。比如下面这张图,我通过Halcon先转为灰度图,然后用Ctrl 鼠标可以获取每个区块的灰度值,如下下图(灰度值用黄色标出)
那么,如果我想获取灰色的矩形区域,只要设置低阈值小于127且大于90,高阈值大于127且小于137即可,当然,用Halcon的灰度直方图助手更快捷方便
Halcon提供了这样的方法,可以简单实现,那么OpenCV怎么实现呢?
假设阈值区间[a, b],低阈值a, 高阈值b
(1)设置阈值为a,大于a像素值则置为255,小于为0
(2)设置阈值为b,大于b像素值则置为255,小于为0
(3)a与b阈值的结果图相减(a - b)就可以得到[a, b]之间的阈值
代码实现与结果(右下角最终结果):
当然也可以用遍历像素的方法实现,大家自己尝试,C 用指针或者迭代器