使用OpenCV在Python中去除黑白卡通人像的小黑点
解决OpenCV生成黑白卡通图时的小黑点问题
嘿,作为OpenCV新手能做出初步效果已经很棒啦!你遇到的小黑点问题其实是边缘检测和阈值处理后残留的噪点,咱们可以通过几步简单的处理来去除它们,我给你梳理一下解决方案:
问题原因分析
你当前的流程里,Laplacian边缘检测会捕捉到很多细微的噪点,之后的阈值处理把这些噪点保留成了小黑点;另外中值滤波只在灰度图阶段用了一次,可能不足以完全消除原始图里的细微噪点。
具体解决方案
- 给边缘图做形态学操作
用形态学开运算去除边缘图里的细碎噪点,开运算可以有效清除小的白色噪点,避免后续阈值处理时转化为小黑点。 - 优化mask的后处理
得到mask之后,再做一次中值滤波,进一步消除残留的小黑点。 - 可选:调整阈值参数
可以尝试微调阈值数值,或者改用自适应阈值,让阈值根据局部区域自动调整,减少噪点的产生。
修改后的代码
import cv2 # 读取输入图片 image = cv2.imread('input1.jpg') # 转灰度并做中值滤波去噪 img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) img_gray = cv2.medianBlur(img_gray, 5) # Laplacian边缘检测 edges = cv2.Laplacian(img_gray, cv2.CV_8U, ksize=5) # 形态学开运算:清除边缘图中的细碎噪点 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) edges = cv2.morphologyEx(edges, cv2.MORPH_OPEN, kernel) # 阈值处理生成mask ret, mask = cv2.threshold(edges, 100, 255, cv2.THRESH_BINARY_INV) # 对mask做中值滤波,消除残留小黑点 mask = cv2.medianBlur(mask, 3) # 生成最终卡通风格图 image2 = cv2.bitwise_and(image, image, mask=mask) # 显示结果 cv2.imshow("Mask", mask) cv2.imshow("Cartoon Result", image2) cv2.waitKey(0) cv2.destroyAllWindows()
关键修改说明
- 新增
cv2.morphologyEx开运算步骤,用3x3矩形核过滤边缘图里的小噪点; - 对生成的mask再做一次3x3中值滤波,彻底清除残留的小黑点;
- 补充了结果显示代码,方便你直接对比处理前后的差异。
你提到的小黑点示例图:
内容的提问来源于stack exchange,提问作者Hasnain
相关产品推荐
相关产品推荐

