如何在图片中找到极端角点?

3

source image1 source image2

destination image1 destination image2

根据上面的原始图像(source image1、image2),我想找到极端角点,并获得像目标图像1、图像2中我绘制的红色圆圈点一样的点。

实际上,我研究了Harris和Shi Tomasi算法,但它们并不是那么极端。

实际上,我已经尝试使用Java代码中的goodFeaturesToTrack,例如:

goodFeaturesToTrack(basedImg,corners,10,0.2,10,maskMat,3,false,0.04);  for (int j=0;j<cornerArray.length;j++){
                Point curP = cornerArray[j];
                Imgproc.circle(retImg,curP,3,new Scalar(255,0,0),-1);
            }

结果图像如下:

magnify to find blue corner point

虽然它可以找到一些蓝色特征点,但不像我展示的目标图像1、图像2那样极其明显。
那么你有什么好的想法来找到特殊字符的角点吗?

2
从我的角度来看,你的问题/任务没有被充分定义。你如何描述“极端角点”?Stack Overflow是用于实际编码问题的,而不是外包底层问题解决。请提供“极端角点”的适当描述,并展示你已经尝试过的任何方法(和代码)。 - HansHirse
从我的目标图像1、图像2中,您可以看到我所绘制的角点。这是极端角点的示例。 - Jim Green
我会从approxPolyDP开始。 - beaker
2个回答

1
你可以使用cv2.goodFeaturesToTrack()进行角点检测。该函数需要四个参数。
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance)
  • image - 输入8位或32位浮点灰度单通道图像
  • maxCorners - 返回角点的最大数量
  • qualityLevel - 角点的最小可接受质量水平,取值范围为0-1。所有低于质量水平的角点都将被拒绝
  • minDistance - 角点之间可能的最小欧几里得距离

enter image description here

import cv2

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

corners = cv2.goodFeaturesToTrack(gray,10,0.2,20)

for corner in corners:
    x,y = corner.ravel()
    cv2.circle(image,(x,y),5,(36,255,12),-1)

cv2.imshow('image', image)
cv2.waitKey()

我已经尝试了goodFeaturesToTrack,但它并不是那么极端。 - Jim Green
你能详细说明一下你所说的“极端”是什么意思吗? - nathancy
找到我在目标图像1、图像2上绘制的角点。 - Jim Green

0

看起来alphashape可以给你想要的东西,如果你把二进制图像像素视为要包围的点的集合。

他们文档中的示例:

points

enclosed


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接