Разрыв кривой везде, где наблюдается значительное изменение кривой.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Разрыв кривой везде, где наблюдается значительное изменение кривой.

Сообщение Anonymous »

Всякий раз, когда происходит значительное изменение кривой, мне нужно разбить кривую, установив толщину разрыва всего в 1 пиксель (я просто хочу разбить кривые на несколько частей). Я приложил изображение для справки. Итак, после того, как я прочитал изображение, я утончил кривую, и там, где есть красные точки, мне нужно разделить ее вокруг этой области.
Изображение

< 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»