我是图像处理的新手,并开始学习scikit-image。我试图检测矩形的角落,然后将整个图像裁剪为它。但是我在大量的分割和检测算法中迷失了,并且不知道我需要哪一个以及如何去做。
此代码生成示例图像。我想把它裁剪成绿色矩形。我需要做什么?
从matplotlib导入pyplot作为pyplot
import numpy as np
import skimage
from skimage import draw
img = np.zeros((500, 500, 3), dtype=np.double)
poly = np.array([[25, 25],
[25, 75],
[75, 75],
[75, 25]])
rr, cc = draw.polygon(poly[:, 0], poly[:, 1], img.shape)
img[rr, cc, 1] = 1
plt.imshow(img)
plt.show()
任务是检测矩形(多边形阵列)的边缘并将图像裁剪到它。
我尝试过哈里斯角检测,精确边缘检测等等,但我完全糊涂了。这似乎是一项简单的任务,但我没有得到它。
使用OpenCV会更容易吗?请帮忙!
答案 0 :(得分:0)
如果您与轮廓寻找方法联系在一起,OpenCV是目前最好的选择。如果您可以通过其他方式识别对象,则可以很容易地识别坐标并裁剪图像。例如:
import numpy as np
import skimage
from skimage import draw, measure
import matplotlib.pyplot as plt
# --- Generate test data ---
img = np.zeros((500, 500, 3), dtype=np.double)
poly = np.array([[25, 25],
[25, 75],
[75, 75],
[75, 25]])
rr, cc = draw.polygon(poly[:, 0], poly[:, 1], img.shape)
img[rr, cc, 1] = 1
# --- End generate test data ---
# Generate a mask with all objects close to green
green = (0, 1, 0)
mask = np.sum((img - green)**2, axis=2) < 0.1
# Label the different objects in the image
label_img = measure.label(mask)
# Find all objects
regions = measure.regionprops(label_img)
# Find the first object (since we only have one, that's the rectangle!)
r = regions[0]
# We'll use the `bbox` property to select the bounding box
# # For a full list of properties, take a look at the docstring of
# measure.regionprops
print('The bounding box is {}'.format(r.bbox))
r0, c0, r1, c1 = r.bbox
img_crop = img[r0:r1, c0:c1]
f, (ax0, ax1) = plt.subplots(1, 2)
ax0.imshow(img)
ax1.imshow(img_crop)
plt.show()