在Matlab中,我可以使用逻辑(img)将所有非零元素转换为一个。
是否有一种简单的方法(即没有循环)将存储在cv :: Mat中的所有非零转换为OpenCV中的一个?
谢谢!
答案 0 :(得分:4)
有许多功能可以帮助你,但这取决于你拥有什么以及你想要获得什么。
1)OpenCV具有函数compare和运算符'!='(以及您可能需要的任何其他运算符)。你可以写:
img = (img != 0);
这会将矩阵的任何非零值转换为255.我知道你想将它转换为1,但如果255对你来说足够好,那么这是最好的方法。在过去遇到的任何任务中,转换为255总是比转换为1更好,因为您可以将结果图像用于各种按位操作,如逻辑AND,OR等......
2)如果你想转换为1,矩阵是正整数(或字符或短路),你可以使用函数min。
img = min(img,1);
3)你也可以使用函数threshold作为@Roger Rowland建议。
答案 1 :(得分:0)
为方便起见,您可以在OpenCV中使用threshold()
函数。
你提到“非零”元素。如果您的矩阵具有负数,并且您仍希望将其设置为1,请使用threshold( abs(my_mat), .. )
。
一般来说,这也可以通过以下方式完成:
Mat my_mat;
Mat reference = Mat::zeros( rows, cols, type );
Mat result = (abs(my_mat) > reference)/255;
这个更长,可能看起来更麻烦,但它的优点是reference
可以根据需要调整为除了全零之外的其他东西(例如,它可以是渐变)。此外,<
不是唯一可以适合的运算符 - 可以使用任何逻辑运算符。逻辑运算的结果总是0或255,因此是除法。