我的问题是: 对于图像中对象周围的边界框,我有ROI。 ROI是由Faster R-CNN获得的。现在,我要应用阈值处理,以将对象准确地包含在边界框中。该图像的投资回报率由Faster RCNN获得。
因此,在获得ROI之后,我仅从图像中选择ROI并粘贴到相同大小和尺寸的黑色图像上,从而产生下图。
您会看到方框是矩形的,因此在某些地方它会覆盖一些背景区域以及尖峰。那么,如何应用阈值处理以仅使尖峰和其他像素变为黑色?
编辑: 我已将链接添加到问题中第一张图片的ROI文本文件中
答案 0 :(得分:6)
使用cv2.inRange()
的颜色阈值应该在这里起作用。我假设您想隔离绿色区域
这是主要思想
获得遮罩后,您也可以执行morphological operations来平滑或消除噪声
import numpy as np
import cv2
image = cv2.imread('1.jpg')
result = image.copy()
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([18, 0, 0])
upper = np.array([179, 255, 255])
mask = cv2.inRange(image, lower, upper)
result = cv2.bitwise_and(result,result, mask=mask)
cv2.imshow('result', result)
cv2.imwrite('result.png', result)
cv2.waitKey()
您可以使用HSV颜色阈值脚本来隔离所需的颜色范围
import cv2
import sys
import numpy as np
def nothing(x):
pass
# Create a window
cv2.namedWindow('image')
# create trackbars for color change
cv2.createTrackbar('HMin','image',0,179,nothing) # Hue is from 0-179 for Opencv
cv2.createTrackbar('SMin','image',0,255,nothing)
cv2.createTrackbar('VMin','image',0,255,nothing)
cv2.createTrackbar('HMax','image',0,179,nothing)
cv2.createTrackbar('SMax','image',0,255,nothing)
cv2.createTrackbar('VMax','image',0,255,nothing)
# Set default value for MAX HSV trackbars.
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# Initialize to check if HSV min/max value changes
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
img = cv2.imread('1.jpg')
output = img
waitTime = 33
while(1):
# get current positions of all trackbars
hMin = cv2.getTrackbarPos('HMin','image')
sMin = cv2.getTrackbarPos('SMin','image')
vMin = cv2.getTrackbarPos('VMin','image')
hMax = cv2.getTrackbarPos('HMax','image')
sMax = cv2.getTrackbarPos('SMax','image')
vMax = cv2.getTrackbarPos('VMax','image')
# Set minimum and max HSV values to display
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
output = cv2.bitwise_and(img,img, mask= mask)
# Print if there is a change in HSV value
if( (phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# Display output image
cv2.imshow('image',output)
# Wait longer to prevent freeze for videos.
if cv2.waitKey(waitTime) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
这是原始图像上的结果
答案 1 :(得分:5)
在TensorFlow检测中,运行预测后获得的输出字典包含一个字段“ detection_scores”。
output_dict = sess.run(tensor_dict,feed_dict={image_tensor: image})
为此设置一个阈值
indexes=np.where(output_dict['detection_scores']>0.5)
仅在您在上一步中过滤的那些特定索引上使用框,即output_dict ['detection_boxes']。
[编辑] 讨论结束后添加更多代码
#convert the image to hsv
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
#tune the numbers below accordingly
lower_green = np.array([60, 100, 50])
upper_green = np.array([60 , 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
res = cv2.bitwise_and(frame,frame, mask= mask)
#res has the output masked image
[编辑]使用问题中给出的实际图像进行编辑
img=cv2.imread("idJyc.jpg")
lower_green = np.array([0, 10, 0])
upper_green = np.array([255 , 100, 255])
mask = cv2.inRange(img, lower_green, upper_green)
mask = np.abs(255-mask)
res = cv2.bitwise_and(img,img, mask=mask)
cv2.imshow("a",res)
cv2.waitKey(0)
添加输出图像以供参考。
答案 2 :(得分:3)
如果您熟悉神经网络的应用并且 足够的数据。此任务非常适合细分。
我推荐U-Net,因为它可以处理少量标记数据进行训练。对于这项任务,它的执行速度快速,几乎不需要操作,且复杂度较低。 并在各种任务上显示出良好的性能。
我还发现了full code pipeline,在这种情况下用于斑马鱼的心脏分割,但是我认为他们在解释如何准备数据(建议使用标记工具等)和训练模型方面做得很好。
也可以退一步,您也可以考虑从一开始就将您的任务解释为细分任务。特别是对于U-Net,在同一张图像中分割多个实例应该不是问题。