图像预处理:轮廓扩展
Image preprocessing: contour expansion
我想做一些图像预处理,但有一个步骤我不确定最好的方法。
我有带注释的有趣区域的 MRI 图像,我检测轮廓并裁剪图像:
我将在此处 post 我的代码,以便您了解我如何完成前面的步骤以及我们拥有的数据
lower_orange = np.array([0, 80, 50],np.uint8)
upper_orange = np.array([255, 255, 255],np.uint8)
for frame in frames:
cv2.imshow('Original frame',frame)
cv2.waitKey(0)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contour = cv2.inRange(hsv, lower_orange, upper_orange)
x,y,w,h = cv2.boundingRect(contour)
mask_inv = cv2.bitwise_not(contour)
frame = cv2.bitwise_and(hsv,hsv,mask = mask_inv)
cv2.imshow('Contoured frame',frame)
cv2.waitKey(0)
croped = frame[y:y+h,x:x+w]
resized = cv2.resize(croped,(240,240))
gray = resized[:,:,2]
cv2.imshow('Grayscale frame',gray)
cv2.waitKey(0)
feature.append(gray)
我现在要做的是把轮廓外的东西都涂黑:
您知道使用 OpenCV 执行此操作的任何本机方法吗?或者任何算法或非本地方法来实现?
非常感谢
正如 Yunus Temuerlenkl 在评论中告诉我的那样。
此方法的精度取决于轮廓蒙版的精度。
尽管这是一种迭代方法,但它不会为我增加太多处理时间。您可以做的一件事是并行处理您的images/frames。
for idx, frame in enumerate(frames):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contour = cv2.inRange(hsv, lower_orange, upper_orange)
x,y,w,h = cv2.boundingRect(contour)
croped_img = frame[y:y+h,x:x+w]
croped_mask = contour[y:y+h,x:x+w]
resized_gray_img = cv2.resize(croped_img,(dim,dim))[:,:,2]
resized_mask = cv2.resize(croped_mask,(dim,dim))
for row in range(dim):
i = 0
is_contour = False
while((i < dim) & (not is_contour)):
if(resized_mask[row,i]):
is_contour = True
resized_gray_img[row,i] = 0
i+=1
if not is_contour: continue
is_contour = False
i = dim -1
while((i >= 0) & (not is_contour)):
if(resized_mask[row,i]):
is_contour = True
resized_gray_img[row,i] = 0
i-=1
mask_inv = cv2.bitwise_not(resized_mask)
img = cv2.bitwise_and(resized_gray_img,resized_gray_img,mask = mask_inv)
feature.append(img)
我想做一些图像预处理,但有一个步骤我不确定最好的方法。
我有带注释的有趣区域的 MRI 图像,我检测轮廓并裁剪图像:
我将在此处 post 我的代码,以便您了解我如何完成前面的步骤以及我们拥有的数据
lower_orange = np.array([0, 80, 50],np.uint8)
upper_orange = np.array([255, 255, 255],np.uint8)
for frame in frames:
cv2.imshow('Original frame',frame)
cv2.waitKey(0)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contour = cv2.inRange(hsv, lower_orange, upper_orange)
x,y,w,h = cv2.boundingRect(contour)
mask_inv = cv2.bitwise_not(contour)
frame = cv2.bitwise_and(hsv,hsv,mask = mask_inv)
cv2.imshow('Contoured frame',frame)
cv2.waitKey(0)
croped = frame[y:y+h,x:x+w]
resized = cv2.resize(croped,(240,240))
gray = resized[:,:,2]
cv2.imshow('Grayscale frame',gray)
cv2.waitKey(0)
feature.append(gray)
我现在要做的是把轮廓外的东西都涂黑:
您知道使用 OpenCV 执行此操作的任何本机方法吗?或者任何算法或非本地方法来实现?
非常感谢
正如 Yunus Temuerlenkl 在评论中告诉我的那样。
此方法的精度取决于轮廓蒙版的精度。
尽管这是一种迭代方法,但它不会为我增加太多处理时间。您可以做的一件事是并行处理您的images/frames。
for idx, frame in enumerate(frames):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
contour = cv2.inRange(hsv, lower_orange, upper_orange)
x,y,w,h = cv2.boundingRect(contour)
croped_img = frame[y:y+h,x:x+w]
croped_mask = contour[y:y+h,x:x+w]
resized_gray_img = cv2.resize(croped_img,(dim,dim))[:,:,2]
resized_mask = cv2.resize(croped_mask,(dim,dim))
for row in range(dim):
i = 0
is_contour = False
while((i < dim) & (not is_contour)):
if(resized_mask[row,i]):
is_contour = True
resized_gray_img[row,i] = 0
i+=1
if not is_contour: continue
is_contour = False
i = dim -1
while((i >= 0) & (not is_contour)):
if(resized_mask[row,i]):
is_contour = True
resized_gray_img[row,i] = 0
i-=1
mask_inv = cv2.bitwise_not(resized_mask)
img = cv2.bitwise_and(resized_gray_img,resized_gray_img,mask = mask_inv)
feature.append(img)