如何让OpenCV的Canny边缘检测输出True/False或1/0的二进制数组?
当然没问题!OpenCV的Canny边缘检测默认输出是8位灰度格式的NumPy数组(0表示非边缘像素,255表示边缘像素),要转换成你想要的布尔型(True/False)或者1/0的二进制数组,其实几步就能实现,和Matlab默认的输出形式完全对齐。
方法1:转换为布尔数组(True=边缘,False=非边缘)
直接用NumPy的比较运算符就能完成,因为Canny输出里边缘像素固定是255,非边缘都是0,两种判断方式都可行:
import cv2 import numpy as np # 读取目标灰度图像 gray_img = cv2.imread("your_image_path.jpg", cv2.IMREAD_GRAYSCALE) # 执行Canny边缘检测(参数可根据需求调整) canny_result = cv2.Canny(gray_img, threshold1=50, threshold2=150) # 方式1:判断像素是否大于0(等价于是否为边缘) bool_edges = canny_result > 0 # 方式2:直接判断是否等于255(结果和上面完全一致) bool_edges = canny_result == 255
方法2:转换为1/0的整数数组(1=边缘,0=非边缘)
如果需要数值型的二进制数组,有几种简洁的实现方式:
- 方式A:基于布尔数组转换类型
# 把布尔数组直接转为uint8类型,True会变成1,False变成0 binary_edges = (canny_result > 0).astype(np.uint8)
- 方式B:用np.where做条件映射
# 当像素为255时赋值1,否则赋值0 binary_edges = np.where(canny_result == 255, 1, 0)
- 方式C:利用整数除法简化操作
# 255//255=1,0//255=0,一步得到结果 binary_edges = canny_result // 255
补充一下:Matlab里的
edge函数默认返回的就是逻辑(布尔)数组,和我们上面生成的bool_edges效果完全相同,这样转换后就能和Matlab的输出逻辑保持一致啦。
内容的提问来源于stack exchange,提问作者Anas Mansour
相关产品推荐
相关产品推荐

