
< img alt="Это результат, который я сейчас получаю" src="https://i.sstatic.net/iVZbtYgj.png" />

Первое изображение — это входное изображение, а красные точки указывают, где я хочу разрезать ( на изображении на самом деле не будет красной точки)/Второе изображение — это текущий результат, который я получаю.
Третье изображение — это неизмененное изображение для справки.
Я пробовал внедрение следующих кодов:
Код: Выделить всё
import cv2
import numpy as np
from matplotlib import pyplot as plt
image_path = rf'C:\Users\User\Desktop\output.png'
img = cv2.imread(image_path, 0)
ret, binary = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY)
binary = cv2.ximgproc.thinning(binary, thinningType=cv2.ximgproc.THINNING_GUOHALL)
coords = np.column_stack(np.where(binary > 0))
def calculateAngle(p1, p2, p3):
v1 = np.array(p2) - np.array(p1)
v2 = np.array(p3) - np.array(p2)
angle = np.arctan2(v2[1], v2[0]) - np.arctan2(v1[1], v1[0])
angle = np.degrees(angle)
if angle < 0:
angle += 360
return angle
startBlackImg = np.zeros((binary.shape[0], binary.shape[1], 1), np.uint8)
i = 1
while i < (len(coords) - 1):
p1 = coords[i - 1]
p2 = coords[i]
p3 = coords[i + 1]
i += 1
angle = calculateAngle(p1, p2, p3)
if angle < 45 or angle > 315:
startBlackImg[p2[0], p2[1]] = 255
else:
startBlackImg[p2[0], p2[1]] = 0
cv2.namedWindow('Check', 0)
cv2.imshow('Check', startBlackImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
Код: Выделить всё
while kk < len(cutContour) - 10:
xCdte = cutContour[kk][0][0]
yCdte = cutContour[kk][0][1]
xNextCdte = cutContour[kk + 10][0][0]
yNextCdte = cutContour[kk + 10][0][1]
kk += 1
if totalDistance = 10) or (abs(xCdte - xNextCdte) >= 10 and abs(yCdte - yNextCdte) < 10):
startBlackImg[yCdte, xCdte] = np.array([255, 255, 255])
startBlackImg[yNextCdte, xNextCdte] = np.array([255, 255, 255])
else:
startBlackImg[yCdte, xCdte] = np.array([0, 0, 0])
kk += 10
РЕДАКТИРОВАТЬ: Решение @TinoD в комментариях действительно указало мне правильное направление. Я использовал PrewittY и отфильтровал его на основе этого. Поэтому все, что мне нужно сделать, это получить местоположение крайних концов в пикселях, а затем вырезать исходное изображение в этом месте.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -the-curve