opencv Python -在图像中心分割图像

ecbunoof  于 2023-02-09  发布在  Python
关注(0)|答案(1)|浏览(270)

目前,我有一个包含中点坐标的数组,然后我用它来画一条通过这些坐标的线。然后我想把我画的身体线上下的图像分开,但是我不知道怎么做,所以请给我一个想法;我真的很感激
我希望结果看起来像这张图片

数组a =[(第954、88段)(905、97),(第855、107页)(805、114),(755、125),(705、134),(第655、139段)(第605、141段)(555、139)、(505、134)、(455、139)、(405、146)、(355、146)、(305、144)、(255、145)、(205、125)、(155、120)、(105、114)、(55、104)、(1、156)]
用于运行程序的映像:original image和运行后的结果:result

hts6caw3

hts6caw31#

下面是在Python/OpenCV中实现这一点的一种方法。

  • 读取输入
  • 列出原点的Numpy数组
  • 在数组的输入副本上绘制多边形
  • 扩大点的数组以围绕图像的顶部生成一个多边形
  • 在黑色背景上绘制一个白色填充多边形作为mask1
  • 使用mask1涂黑输入图像的底部并保留顶部
  • 扩大点的数组以围绕图像底部生成一个多边形
  • 在黑色背景上绘制一个白色填充多边形作为mask2
  • 使用mask2涂黑输入图像的顶部并保留底部
  • 保存结果

输入:

import cv2
import numpy as np

# read the input
img = cv2.imread('fish.png')
h, w = img.shape[:2]

# create black image like input
black = np.zeros_like(img)

# define original point
points = np.array([[954,88],[905,97],[855,107],[805,114],[755,125],[705,134],[655,139],[605,141],[555,139],[505,134],[455,139],[405,146],[355,146],[305,144],[255,145],[205,125],[155,120],[105,114],[55,104],[1,156]])

# draw points on input
img_pts = img.copy()
cv2.polylines(img_pts, [points], False, (0,0,255), 2)

# augment original polygon array for top region
points1 = np.array([[0,0],[w-1,0],[w-1,88],[954,88],[905,97],[855,107],[805,114],[755,125],[705,134],[655,139],[605,141],[555,139],[505,134],[455,139],[405,146],[355,146],[305,144],[255,145],[205,125],[155,120],[105,114],[55,104],[1,156],[0,156]])

# draw white filled closed polygon on black background
mask1 = black.copy()
cv2.fillPoly(mask1, [points1], (255,255,255))

# Use mask to select top part of image
result1 = np.where(mask1==255, img, black)

# augment polygon array for bottom region
points2 = np.array([[0,h-1],[w-1,h-1],[w-1,88],[954,88],[905,97],[855,107],[805,114],[755,125],[705,134],[655,139],[605,141],[555,139],[505,134],[455,139],[405,146],[355,146],[305,144],[255,145],[205,125],[155,120],[105,114],[55,104],[1,156],[0,156]])

# draw white filled closed polygon on black background
mask2 = black.copy()
cv2.fillPoly(mask2, [points2], (255,255,255))

# Use mask to select part of image
result2 = np.where(mask2==255, img, black)

# save results
cv2.imwrite('fish_with_points.jpg', img_pts)
cv2.imwrite('fish_top_mask.jpg', mask1)
cv2.imwrite('fish_top_masked.jpg', result1)
cv2.imwrite('fish_bottom_mask.jpg', mask2)
cv2.imwrite('fish_bottom_masked.jpg', result2)

# show results
cv2.imshow('img_points',img_pts)
cv2.imshow('mask1',mask1)
cv2.imshow('result1',result1)
cv2.imshow('mask2',mask2)
cv2.imshow('result2',result2)
cv2.waitKey(0)

输入时的原点折线:

面罩1:

结果1:

掩模2:

结果2:

相关问题