如何将Matlab的min(min(r,g),b)逻辑转换为Python实现?
实现Matlab逐元素取多矩阵最小值的Python方案
你遇到的AttributeError是因为(r, g)是Python元组,元组没有min()方法。要实现和Matlab完全一致的逐元素对应位置取最小值效果,可借助NumPy的函数完成,以下是具体解决方案:
正确实现代码
假设你的r、g、b是OpenCV处理后得到的NumPy数组(OpenCV返回的图像默认是NumPy数组),可以用两种方式实现:
方式1:对应Matlab嵌套写法
import numpy as np import cv2 rgb = cv2.normalize(temp_rgb.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX) r = rgb[:, :, 0] g = rgb[:, :, 1] b = rgb[:, :, 2] # 先比较r和g的逐元素最小值,再与b比较 result = np.minimum(np.minimum(r, g), b)
方式2:更简洁的通道轴取最小值
import numpy as np import cv2 rgb = cv2.normalize(temp_rgb.astype('float'), None, 0.0, 1.0, cv2.NORM_MINMAX) # 直接沿RGB通道轴(第2轴)取每个像素位置的最小值 result = np.min(rgb, axis=2)
代码说明
np.minimum(a, b):对两个NumPy数组执行逐元素比较,返回对应位置的最小值数组,和Matlab中min(a, b)的行为完全一致,嵌套调用即可实现三个数组的逐元素最小值计算。np.min(rgb, axis=2):利用rgb数组(高度, 宽度, 3)的形状,沿通道轴(第2个轴)取最小值,一步得到所有像素位置的RGB最小值,代码更简洁。
验证示例
用你给出的Matlab测试数据验证:
import numpy as np r = np.array([[10, 30, 23, 50, 27], [99, 21, 38, 44, 62], [90, 22, 64, 12, 56]]) g = np.array([[92, 74, 91, 37, 33], [14, 82, 44, 22, 49], [88, 10, 98, 74, 33]]) b = np.array([[73, 22, 94, 18, 34], [88, 37, 29, 12, 30], [79, 39, 48, 95, 24]]) result = np.minimum(np.minimum(r, g), b) print(result) # 输出与Matlab结果一致: # [[10 22 23 18 27] # [14 21 29 12 30] # [79 10 48 12 24]]
内容的提问来源于stack exchange,提问作者KEZIA ANGELINE
相关产品推荐
相关产品推荐

