Opencv 打开cv查找图像中的白色峰值
我有以下图像: 我想找到不同周期特征的白色中心。我把我要找的东西标上了小红点。边缘模糊的,我不在乎。只有中间的特征。什么openCv方法最适合实现我想要的 我试着在我的图像上使用,但结果并不接近 多亏了下面的答案,我才想出了这个解决方案(使用C#library包装器OpenCV sharp): 方法:Opencv 打开cv查找图像中的白色峰值,opencv,Opencv,我有以下图像: 我想找到不同周期特征的白色中心。我把我要找的东西标上了小红点。边缘模糊的,我不在乎。只有中间的特征。什么openCv方法最适合实现我想要的 我试着在我的图像上使用,但结果并不接近 多亏了下面的答案,我才想出了这个解决方案(使用C#library包装器OpenCV sharp): 方法: private List<Point> GetPeaks(Mat mat) { Mat findPeaksMat = new Mat(); m
private List<Point> GetPeaks(Mat mat)
{
Mat findPeaksMat = new Mat();
mat.ConvertTo(findPeaksMat, MatType.CV_8UC1);
Cv2.Threshold(findPeaksMat, findPeaksMat, 100, 255, ThresholdTypes.Binary);
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(findPeaksMat, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
var points = ContoursCenter(contours, true);
return points.Where(p => p.X >= 0 && p.Y >= 0).ToList();
}
private List<Point> ContoursCenter(Point[][] contours,bool centerOfMass,int contourIdx = -1)
{
List<Point> result = new List<Point>();
if (contourIdx > -1)
{
if (centerOfMass)
{
Moments m = new Moments(contours[contourIdx], true);
result.Add(new Point(m.M10/m.M00, m.M01/m.M00));
}
else
{
Rect rct = Cv2.BoundingRect(contours[contourIdx]);
result.Add(new Point(rct.X + rct.Width / 2 , rct.Y + rct.Height / 2));
}
}
else
{
if (centerOfMass)
{
for (int i = 0; i < contours.Length; i++)
{
Moments m = new Moments(contours[i], true);
result.Add(new Point(m.M10 / m.M00, m.M01 / m.M00));
}
}
else
{
for (int i = 0; i < contours.Length; i++)
{
Rect rct = Cv2.BoundingRect(contours[i]);
result.Add(new Point(rct.X + rct.Width / 2 , rct.Y + rct.Height / 2));
}
}
}
return result;
}
private List GetPeaks(Mat-Mat)
{
Mat findPeaksMat=新Mat();
材料转换器(findPeaksMat,材料类型CV_8UC1);
阈值(findPeaksMat,findPeaksMat,100255,ThresholdTypes.Binary);
点[]等高线;
层次索引[]层次结构;
Cv2.FindContours(findPeaksMat、out轮廓、out层次、RetrievalModes.External、ContourApproximationModes.ApproxSimple);
var点=轮廓仪(轮廓,真);
返回点。其中(p=>p.X>=0和&p.Y>=0)。ToList();
}
私有列表轮廓仪(点[][]轮廓,布尔质量中心,int contourIdx=-1)
{
列表结果=新列表();
如果(轮廓线>-1)
{
if(质量中心)
{
力矩m=新力矩(等高线[contourIdx],真);
结果.添加(新点(m.M10/m.M00,m.M01/m.M00));
}
其他的
{
Rect rct=Cv2.BoundingRect(等高线[contourIdx]);
结果。添加(新点(rct.X+rct.Width/2,rct.Y+rct.Height/2));
}
}
其他的
{
if(质量中心)
{
对于(int i=0;i
我认为对图像进行阈值化,找到轮廓,按面积过滤轮廓,并计算中心将完成这项工作
我认为对图像进行阈值化、找到轮廓、按面积过滤轮廓并计算中心将完成这项工作
这个问题很简单。您可以使用以下两种方法之一:
轮廓检测和基于轮廓面积的阈值化李>
连接组件分析和基于组件面积的阈值李>
注意:由于您尚未添加原始图像,因此我从另一个答案中获取了该图像!如果你附上原始图像,我很乐意适当调整答案
守则:
import cv2
import numpy as np
arr = cv2.imread("U:/SO/Lvw2I.png")`
imgray = cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
# Based on contours
im2, contours, heirarchy = cv2.findContours(thresh, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if cv2.contourArea(cnt) > 120:
cv2.drawContours(arr, [cnt], 0, (0, 255, 0), 3)
# Based on CCA
labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(imgray)
for label in range(1, labelnum):
x, y = GoCs[label]
x, y, w, h, size = contours[label]
if size >= 180:
img = cv2.rectangle(imgray, (x, y), (x+w, y+h), (255, 255, 0), 1)
结果:
希望有帮助 这个问题很简单。您可以使用以下两种方法之一:
轮廓检测和基于轮廓面积的阈值化李>
连接组件分析和基于组件面积的阈值李>
注意:由于您尚未添加原始图像,因此我从另一个答案中获取了该图像!如果你附上原始图像,我很乐意适当调整答案
守则:
import cv2
import numpy as np
arr = cv2.imread("U:/SO/Lvw2I.png")`
imgray = cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
# Based on contours
im2, contours, heirarchy = cv2.findContours(thresh, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if cv2.contourArea(cnt) > 120:
cv2.drawContours(arr, [cnt], 0, (0, 255, 0), 3)
# Based on CCA
labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(imgray)
for label in range(1, labelnum):
x, y = GoCs[label]
x, y, w, h, size = contours[label]
if size >= 180:
img = cv2.rectangle(imgray, (x, y), (x+w, y+h), (255, 255, 0), 1)
结果:
希望有帮助 你的意思是你只想要你标记的4?或者你仅仅是因为你想要的其他的都是相似的,所以才标记了4?你能不能另外提供一张未标记的图像,以便用please进行测试?当白色圆点被涂成红色时,很难找到它们!是的,很抱歉把它们涂成红色,我意识到这会把任何试图帮助的人的输入图像弄得一团糟。但是使用阈值/轮廓检测,我能够完成我所需要的!任何方法只要找到它们,我就可以减少到我需要的数量。你是说你只想要你标记的4个吗?或者你仅仅是因为你想要的其他的都是相似的,所以才标记了4?你能不能另外提供一张未标记的图像,以便用please进行测试?当白色圆点被涂成红色时,很难找到它们!是的,很抱歉把它们涂成红色,我意识到这会把任何试图帮助的人的输入图像弄得一团糟。但是使用阈值/轮廓检测,我能够完成我所需要的!任何找到它们的方法,我都可以减少到我需要的数量。是的,这正是我所做的。谢谢你的回答。是的,这正是我所做的。谢谢你的回答。