python - 在留下一些灰色污迹的白色背景(粘性陷阱)上检测苍蝇的轮廓
问题描述
所以我试图检测白色陷阱上苍蝇的轮廓,然后将它们裁剪成不同的照片。但是我在陷阱上看到了污迹的轮廓,并且没有检测到一些苍蝇。我也不需要陷阱的绿色线条。我的问题是有什么方法可以确保我得到所有苍蝇的轮廓并且只有文件?
代码:
image = cv2.imread('test3.jpeg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)
示例图像
当前代码的结果
解决方案
使用将颜色空间转换为 HSV 和形态学操作:
import cv2
img1 = cv2.imread('flys.jpg')
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (6,6))
img=cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
mask=cv2.threshold(img1[:,:,2], 85, 255, cv2.THRESH_BINARY)[1]
mask = cv2.dilate(mask, kernel, iterations = 2)
mask = cv2.erode(mask, kernel, iterations = 7)
mask=cv2.bitwise_not(mask)
output = cv2.connectedComponentsWithStats(mask, 4, cv2.CV_32S)
print('number of flies: ', output[0])
for i in range(1, output[0]):
x,y,w,h,s=output[2][i]
img_crop=img1[y:y+h, x:x+w,:]
cv2.imwrite(str(i)+'_crop_fly.jpg', img_crop)
mask=cv2.cvtColor(mask,cv2.COLOR_GRAY2BGR)
mask[:,:,1]=0
dst = cv2.addWeighted(img1, 0.7, mask, 0.3, 0.0)
cv2.imshow('test', dst)
cv2.imwrite('out_fly.jpg', dst)
推荐阅读
- vhdl - 不能将实数和整数相乘
- amazon-web-services - 如何使用 terraform 创建具有公共子网和私有子网的 EKS 集群?
- jquery - jQuery 我有发票计算部分它不能正常工作
- java - 关于 onCreate 方法要点的解释
- asp.net - 使用 MSAL 进行 Microsoft Graph 身份验证(问题)
- xamarin - Mvvmcross 7.0.0:未找到使用 MvvmCross.Forms.Platforms.Android.Core
- c# - 直接在实体上识别实体框架中的延迟加载是否处于活动状态
- c# - RSA 加密性能 1024 位密钥与 2048
- openvpn - OpenVPN“仅将此连接用于其网络上的资源”不允许访问 VPN 托管站点(Ubuntu 20.04)
- android - Nativescript CLI 说 Android SDK 配置不正确,但我不知道如何修复它