#python #python-3.x #opencv #matplotlib #opencv-python
#python #python-3.x #opencv #matplotlib #opencv-python
Вопрос:
Моя цель — создать изображение, которое включает повернутые углы в виде текста внутри каждой границы. Изображение должно включать цветные границы (которые я выяснил) и значение угла внутри каждой границы (которое я не выяснил).
КОД PYTHON
import matplotlib.pyplot as plt
import cv2
import numpy as np
import csv
mask = cv2.imread('patch_mask.png')
mask = cv2.resize(mask, (400, 400))
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
ret2, th2 = cv2.threshold(mask_gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # Otsu's
method
image = cv2.imread('patch_image.png')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_enhanced = cv2.equalizeHist(image_gray)
# process image
boundary_output = "/Desktop/mat2py/mask_boundary.png"
ellipse_output = "/Desktop/mat2py/ellipse.png"
colormap_output = "/Desktop/mat2py/colormap.png"
# im = cv2.imread("patch_mask.png")
imgray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
# find contours in the binary image
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
tmp = np.zeros_like(mask)
tmp2 = np.zeros_like(mask)
boundary = cv2.drawContours(tmp, contours, -1, (255, 255, 255), 1)
# calculate moments and extract cell shape info
moment_dict = {}
for index, cnt in enumerate(contours):
moment_dict[index] = cv2.moments(cnt)
# creating a csv file named coordinates
with open('/Desktop/mat2py/coordinates.csv', 'w', newline='') as newFile:
newFileWriter = csv.writer(newFile)
newFileWriter.writerow(
["Center_x", "Center_y", "(Center_x, Center_y)", "(Major Axis, Minor Axis)", "Rotation Angle"])
obj_properties = {}
for index, obj_moments in moment_dict.items():
cx, cy = obj_moments['m10'] / obj_moments['m00'], obj_moments['m01'] / obj_moments['m00']
ellipse = (x, y), (MA, ma), angle = cv2.fitEllipse(contours[index])
props = {'Center_x': cx, 'Center_y': cy, 'Major Axis': MA, 'Minor Axis': ma, 'Rotated Angle': angle}
ellipse_image = cv2.ellipse(imgray, ellipse, (255, 0, 255))
obj_properties[index] = props
newFileWriter.writerow([cx, cy, (x, y), (MA, ma), angle])
all_the_angle = [v['Rotated Angle'] for k, v in obj_properties.items()]
min_angle = 0
max_angle = 180
range_angle = max_angle - min_angle
# color mapping of Rotated Angle scalars to BGR values
cmap = plt.cm.get_cmap('jet')
for index, prop in obj_properties.items():
v = (prop['Rotated Angle'] - min_angle) / range_angle
r, g, b, a = [int(x) for x in cmap(v, bytes=True)]
color_input = (b, g, r)
colormap_image = cv2.drawContours(image, contours, index, color_input, 2)
plt.imshow(colormap_image, cmap=cmap)
cbar = plt.colorbar()
cbar.ax.set_yticklabels([]) # vertically oriented colorbar
cbar.set_label('Angle (Degree)')
plt.show()
# save the boundary, ellipse, and colormap image
plt.imsave(boundary_output, boundary, cmap="gray")
cv2.imwrite(ellipse_output, ellipse_image)
colormap_image = plt.savefig(colormap_output)
# cv2.imwrite(colormap_output, colormap_image)
print("Saved contours, boundaries, ellipse and colormap as images and csv")
Это изображения, которые я использовал.
patch_image
patch_mask
Я получил это. patch_colormap
Как я могу показать повернутый угол на основе каждого контура? Например, внутри каждой границы я хочу добавить текст с ее повернутым углом.
Вот так: edited_patch_colormap
Комментарии:
1. Установите многоточия в каждую белую область вашей маски и получите угол главной оси из возвращаемых значений. Видишь docs.opencv.org/4.1.1/d3/dc0/… Существует несколько методов подгонки эллипсов.
2. Да, я сделал это, но я хотел бы показать углы в виде текста внутри изображения. @fmw42
3. Смотрите cv2.putText() в docs.opencv.org/4.1.1/d6/d6e /… и нарисуйте текст в центре эллипса.