点检测和圆形区域选择

时间:2014-06-17 15:17:40

标签: python opencv image-processing

我正在使用特定类型的图片。那些,在获得光谱(适用于fft)后,我得到以下图片:

enter image description here

所以我想以下列方式选择其中一个“点”(称为频谱顺序):

enter image description here

我的意思是“画”一个圆圈,选择里面的像素然后将这些像素居中(没有“边框圆圈”):

enter image description here

如何使用OpenCV执行此操作?有没有任何功能?

2 个答案:

答案 0 :(得分:5)

编辑:根据下面的讨论,要“选择”圆圈,可以使用掩码:

# Build mask
mask = np.zeros(image_array.shape, dtype=np.uint8)
cv2.circle(mask, max_loc, circle_radius, (255, 255, 255), -1, 8, 0)

# Apply mask (using bitwise & operator)
result_array = image_array & mask

# Crop/center result (assuming max_loc is of the form (x, y))
result_array = result_array[max_loc[1] - circle_radius:max_loc[1] + circle_radius,
                            max_loc[0] - circle_radius:max_loc[0] + circle_radius, :]

这给我留下了类似的东西:

Masked and cropped image

另一个编辑: This可能对查找您的高峰非常有用。

答案 1 :(得分:1)

不确定这是否是您所问的问题,但如果您只想围绕这一点,可以使用子区域来实现:

cv::Point center(yourCenterX_FromLeft, yourCenterY_fromTop);
int nWidth = yourDesiredWidthAfterCentering;  // or 2* circle radius
int nHeight= yourDesiredHeightAfterCentering; // or 2* circle radius

// specify the subregion: top-left position and width/height
cv::Rect subImage = cv::Rect(center.x-nWidth/2, center.y-nHeight/2, nWidth, nHeight);

// extract the subregion out of the original image. remark that no data is copied but original data is referenced
cv::Mat subImageCentered = originalImage(subImage);

cv::imshow("subimage", subImageCentered);

没有测试,但那应该没问题。

编辑:抱歉,它是c ++,但我认为子区域在python中的工作方式类似吗?!?