0
点赞
收藏
分享

微信扫一扫

Halcon实例转OpenCV之实现给定区间二值化


    背景:今天我一个朋友问题,Halcon和OpenCV的全局阈值函数threshold实现结果不一样,怎么办?Halcon实例转OpenCV之实现给定区间二值化_简单实现 是不一样啊,看看参数和原理自己改一个就行了(开玩笑的,别见怪)。

    Halcon中的threshold函数定义如下,提取低阈值和高阈值之间的灰度值

Halcon实例转OpenCV之实现给定区间二值化_简单实现_02

而OpenCV的threshold函数一般是给定一个阈值,对超过或者低于这个阈值的像素进行处理,具体公式如下:

Halcon实例转OpenCV之实现给定区间二值化_代码实现_03

    简单来说,Halcon的threshold函数是获取区间[a, b]之间的灰度值,OpenCV的threshold只能针对大于或者小于a或者b的灰度值处理,一个是双阈值,一个是单阈值。比如下面这张图,我通过Halcon先转为灰度图,然后用Ctrl + 鼠标可以获取每个区块的灰度值,如下下图(灰度值用黄色标出)

Halcon实例转OpenCV之实现给定区间二值化_简单实现_04

Halcon实例转OpenCV之实现给定区间二值化_简单实现_05

那么,如果我想获取灰色的矩形区域,只要设置低阈值小于127且大于90,高阈值大于127且小于137即可,当然,用Halcon的灰度直方图助手更快捷方便

Halcon实例转OpenCV之实现给定区间二值化_简单实现_06

Halcon实例转OpenCV之实现给定区间二值化_灰度值_07

Halcon提供了这样的方法,可以简单实现,那么OpenCV怎么实现呢?

假设阈值区间[a, b],低阈值a, 高阈值b

(1)设置阈值为a,大于a像素值则置为255,小于为0

Halcon实例转OpenCV之实现给定区间二值化_灰度值_08

(2)设置阈值为b,大于b像素值则置为255,小于为0

Halcon实例转OpenCV之实现给定区间二值化_代码实现_09

(3)a与b阈值的结果图相减(a - b)就可以得到[a, b]之间的阈值

Halcon实例转OpenCV之实现给定区间二值化_代码实现_10

代码实现与结果(右下角最终结果):

Halcon实例转OpenCV之实现给定区间二值化_简单实现_11

当然也可以用遍历像素的方法实现,大家自己尝试,C++用指针或者迭代器

Halcon实例转OpenCV之实现给定区间二值化_灰度值_12

Halcon实例转OpenCV之实现给定区间二值化_简单实现_13

举报

相关推荐

0 条评论