如何使用OpenCV移除图片中指定的米色,保留其余目标彩色区域
代码失效原因及修复方案
核心问题
- OpenCV的
cv2.imread接口默认以BGR通道顺序读取图像,你设置的阈值参数是RGB数值,直接传入cv2.inRange会因为通道不匹配,无法正确筛选米色区域。 - 代码中生成了形态学处理后的
morph变量,但后续掩码生成仍然使用原始的thresh,形态学修复噪点、连接区域的效果完全没有生效。
修正后的可运行代码
import cv2 import numpy as np # 读取图像 img = cv2.imread(r'D:\PY\mk1\mk1\sagitale1.png') # 转换为RGB通道,匹配阈值设置 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 定义米色区域的RGB上下阈值,可根据实际效果微调 lower = np.array([101, 69, 51]) upper = np.array([255, 171, 142]) # 筛选米色区域生成阈值图 thresh = cv2.inRange(img_rgb, lower, upper) # 形态学处理,消除小噪点、补全区域断裂 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(20,20)) morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # 反转掩码,保留非米色的其他区域 mask = 255 - morph # 掩码作用到原始BGR图像,生成结果 result = cv2.bitwise_and(img, img, mask=mask) # 保存结果 cv2.imwrite('1_thresh.jpg', thresh) cv2.imwrite('1_result.jpg', result) # 显示结果 cv2.imshow('result', result) cv2.waitKey(0) cv2.destroyAllWindows()
调试建议
如果米色区域筛选不完整或误删了需要保留的区域,可以直接取图像中米色区域的像素RGB值,调整lower和upper的参数即可。
内容的提问来源于stack exchange,提问作者Túlio Brandão Xavier Rocha
相关产品推荐
相关产品推荐

