量化单个图像中不规则形状的最长轴和宽度
Quantify longest axis and width of irregular shapes within a single image
原题
我有大约 80-100 张图像,例如 (A)。每个图像都由在 ImageJ 中标记轮廓后填充黑色的形状组成。我需要提取每个单独的形状,如 (B) 中所示。然后我需要找到最长轴的宽度,如 (C).
然后我需要计算黑色形状内规则点的所有可能宽度和 return 包含这些值的 .csv 文件。
我一直在手动执行此操作,必须有更快的方法来执行此操作。知道我该怎么做吗?
部分解决方案 根据 Epsi 的回答
import matplotlib.pyplot as plt
import cv2
import numpy as np
image = cv2.imread("Desktop/Analysis/NormalCol0.tif")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours, find rotated rectangle, obtain four verticies, and draw
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
lengths = []
for i in contours:
x_y,width_height,angle_of_rotation = cv2.minAreaRect(i)
Height = print(width_height[1])
rect = cv2.minAreaRect(i)
box = np.int0(cv2.boxPoints(rect))
image_contours = np.zeros(image.shape)
# draw the contours on the empty image
cv2.drawContours(image, [box], 0, (36,255,12), 3) # OR
# cv2.polylines(image, [box], True, (36,255,12), 3)
plt.imshow(image)
cv2.imwrite(output,image)
输出:
4031.0
20.877727508544922
51.598445892333984
23.852108001708984
21.0
21.21320343017578
19.677398681640625
43.0
我能够得到每个形状的长度。 我接下来需要弄清楚如何沿着形状的长度在规则点处获取形状的宽度?
因为我对 python 不是很好,所以我不会 post 代码,但会 post 链接到解释和纪录片。
我的做法如下:
反转图像,让所有的白色变成黑色,黑色变成白色。 https://www.delftstack.com/howto/python/opencv-invert-image/#invert-images-using-numpy.invert-method-in-python
使用 findContours 查找所有(现在)白色轮廓。 https://pythonexamples.org/python-opencv-cv2-find-contours-in-image/
使用 minAreaRect 在轮廓周围创建边界框,其定位方式使框的面积尽可能小。 https://theailearner.com/tag/cv2-minarearect/
从创建的边界框中取最长的边,这将代表轮廓的长度。
您还可以从边界框获取旋转角度
原题
我有大约 80-100 张图像,例如 (A)。每个图像都由在 ImageJ 中标记轮廓后填充黑色的形状组成。我需要提取每个单独的形状,如 (B) 中所示。然后我需要找到最长轴的宽度,如 (C).
然后我需要计算黑色形状内规则点的所有可能宽度和 return 包含这些值的 .csv 文件。
我一直在手动执行此操作,必须有更快的方法来执行此操作。知道我该怎么做吗?
部分解决方案 根据 Epsi 的回答
import matplotlib.pyplot as plt
import cv2
import numpy as np
image = cv2.imread("Desktop/Analysis/NormalCol0.tif")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours, find rotated rectangle, obtain four verticies, and draw
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
lengths = []
for i in contours:
x_y,width_height,angle_of_rotation = cv2.minAreaRect(i)
Height = print(width_height[1])
rect = cv2.minAreaRect(i)
box = np.int0(cv2.boxPoints(rect))
image_contours = np.zeros(image.shape)
# draw the contours on the empty image
cv2.drawContours(image, [box], 0, (36,255,12), 3) # OR
# cv2.polylines(image, [box], True, (36,255,12), 3)
plt.imshow(image)
cv2.imwrite(output,image)
输出:
4031.0
20.877727508544922
51.598445892333984
23.852108001708984
21.0
21.21320343017578
19.677398681640625
43.0
我能够得到每个形状的长度。 我接下来需要弄清楚如何沿着形状的长度在规则点处获取形状的宽度?
因为我对 python 不是很好,所以我不会 post 代码,但会 post 链接到解释和纪录片。
我的做法如下:
反转图像,让所有的白色变成黑色,黑色变成白色。 https://www.delftstack.com/howto/python/opencv-invert-image/#invert-images-using-numpy.invert-method-in-python
使用 findContours 查找所有(现在)白色轮廓。 https://pythonexamples.org/python-opencv-cv2-find-contours-in-image/
使用 minAreaRect 在轮廓周围创建边界框,其定位方式使框的面积尽可能小。 https://theailearner.com/tag/cv2-minarearect/
从创建的边界框中取最长的边,这将代表轮廓的长度。
您还可以从边界框获取旋转角度