- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在处理生物信息学的任务,需要从一些细胞图像中提取一些特征。
我使用 SIFT 算法提取图像内部的关键点,如图所示。
正如您在图片中也看到的(红色圈出),一些关键点是异常值,我不想计算它们的任何特征。
我使用以下代码获得了 cv::KeyPoint
vector :
const cv::Mat input = cv::imread("/tmp/image.jpg", 0); //Load as grayscale
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
但我想从 vector
中丢弃所有那些关键点,例如,在以它们为中心的某个感兴趣区域 (ROI) 内,关键点少于 3 个图片。
因此我需要实现一个函数,返回作为输入给定的特定 ROI 内的关键点数:
int function_returning_number_of_key_points_in_ROI( cv::KeyPoint, ROI );
//I have not specified ROI on purpose...check question 3
我有三个问题:
注意:
我忘了说明我想要一个有效的函数实现,即检查每个关键点所有其他关键点相对于它的相对位置将不是一个好的解决方案(如果存在另一种方法)。
最佳答案
我决定采用统计方法,但如果 View 中有多个单元格,这可能不起作用。
我的解决方案相当简单:
distance < mu + 2*sigma
过滤原始关键点这是我使用此算法得到的图像(关键点 == 绿色,质心 == 红色):
最后,这是我如何做到的代码示例:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
void distanceFromCentroid(const vector<Point2f>& points, Point2f centroid, vector<double>& distances)
{
vector<Point2f>::const_iterator point;
for(point = points.begin(); point != points.end(); ++point)
{
double distance = std::sqrt((point->x - centroid.x)*(point->x - centroid.x) + (point->y - centroid.y)*(point->y - centroid.y));
distances.push_back(distance);
}
}
int main(int argc, char* argv[])
{
Mat input = imread("cell.jpg", 0); //Load as grayscale
SiftFeatureDetector detector;
vector<cv::KeyPoint> keypoints;
detector.detect(input, keypoints);
vector<Point2f> points;
vector<KeyPoint>::iterator keypoint;
for(keypoint = keypoints.begin(); keypoint != keypoints.end(); ++keypoint)
{
points.push_back(keypoint->pt);
}
Moments m = moments(points, true);
Point2f centroid(m.m10 / m.m00, m.m01 / m.m00);
vector<double> distances;
distanceFromCentroid(points, centroid, distances);
Scalar mu, sigma;
meanStdDev(distances, mu, sigma);
cout << mu.val[0] << ", " << sigma.val[0] << endl;
vector<KeyPoint> filtered;
vector<double>::iterator distance;
for(size_t i = 0; i < distances.size(); ++i)
{
if(distances[i] < (mu.val[0] + 2.0*sigma.val[0]))
{
filtered.push_back(keypoints[i]);
}
}
Mat out = input.clone();
drawKeypoints(input, filtered, out, Scalar(0, 255, 0));
circle(out, centroid, 7, Scalar(0, 0, 255), 1);
imshow("kpts", out);
waitKey();
imwrite("statFilter.png", out);
return 0;
}
希望对您有所帮助!
关于c++ - 使用 OpenCV 丢弃细胞图像中的异常值 SIFT 关键点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10929422/
我想找到一种方法,允许将图像(查询)的 SIFT 描述符与包含大量不同图片描述符的 SQL 数据库中的描述符进行比较。 事实上,我的最终目的是做一个应用程序,允许将一张图片与数据库(不是在我的设备中)
我正在使用 OpenCV 实现词袋图像分类器。最初我测试了在 SURF 关键点中提取的 SURF 描述符。我听说 Dense SIFT(或 PHOW)描述符更适合我的目的,所以我也尝试了它们。 令我惊
我尝试使用 David Lowe's implementation 对几个不同的对象进行对象检测和 OpenCV implementation (只是在此代码中更改了 'SurfFeatureDete
我正在尝试为我的项目实现 SIFT,我已经掌握了关键点。我尝试使用同一图像的所有关键点获取图像的每个关键点的欧氏距离,但按比例缩小。碰巧查询图像的 1 个关键点与数据库图像中其余关键点的距离具有非常相
我想通过旋转它们来标准化筛选描述符,以便水平方向与补丁的主要梯度方向对齐。 我正在使用 vl_feat 库。 vl_feat 中是否有任何方法可以规范筛选描述? 或 使用 matlab 执行此操作的有
我想使用基于FLANN的Matcher打印检测功能关键点 算法:http://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html。 搜索效果很好
SIFT 是做什么的?它是否建立了 View 之间的特征对应关系?它是否接收图像的角并删除那些没有描述性的角?它会进行匹配吗? 最佳答案 SIFT 是“尺度不变特征变换”的捷径。SIFT 特征通常用于
我正在尝试实现 SIFT,目前我只是想了解它是如何工作的,然后再开始在 MATLAB 中实现它,我了解其中的大部分内容,除了如何使用泰勒展开计算亚像素精度: 以上是原始论文中的方程式。我有几个关于它如
我在 matlab 中使用 SIFT 算法来确定模板图像和一组图像之间的相似性,最后我必须根据 SCORES 确定一组图像之间的最佳匹配,这样说对吗图像的分数越高匹配越好?我知道当存在完全匹配时,分数
我是 Opencv2.3 的入门级程序员,玩弄互联网上可用的代码和各种有用的资源。有 Stack User 实现的代码 User:Froyo在他的网站上 website .当我尝试执行代码时,只要我在
我在执行我的代码时遇到以下错误:(带有 Qt Creator 的 OpenCV) OpenCV Error: Assertion failed (!outImage.empty()) in drawK
我正在使用 OpenCV-Python。 我已经使用 cv2.cornerHarris 识别角点。输出类型为 dst。 我需要计算角点的 SIFT 特征。 sift.compute() 的输入必须是
我读过一些关于 SIFT 的文献,也看过一些视频。我了解 SIFT 背后的大部分概念,但让我感到困惑的是关于 SIFT 描述符的一件事。 在筛选中: 我们找到了一个关键点 我们在关键点周围取 16 x
有 2 张图像 A 和 B。我从中提取关键点(a[i] 和 b[i])。 我想知道如何有效地确定 a[i] 和 b[j] 之间的匹配? 我想到的最明显的方法是将 A 中的每个点与 B 中的每个点进行比
我正在开发一个应用程序,我在其中使用 SIFT + RANSAC 和 Homography 来查找对象(OpenCV C++、Java)。我面临的问题是,在有很多异常值的地方,RANSAC 表现不佳。
我正在开展一个项目,我将使用单应性作为分类器中的特征。我的问题是自动计算单应性,我使用 SIFT 描述符来找到两个图像之间的点来计算单应性,但是 SIFT 给我的结果很差,因此我不能在我的工作中使用它
我想知道,如果我可以更改 SIFT 描述符维度,如果可以,我该怎么做。我知道目前尺寸是 128,我们可以做成 128*4 或 124/4 这样的尺寸吗? 更新:我试图将 SIFT_DESCR_WIDT
我在树莓派 3b 上使用 opencv 4.5.0-pre 和 python 3.7.3。我正在尝试使用 SIFT 为图像拼接找到最匹配的特征。我使用本指南从源代码构建了 opencv https:/
我目前在 工作SIFT ,我已经生成了高斯和极值图像层的差异。谁能向我解释如何使用 Hessian 矩阵来消除低对比度关键点? 最佳答案 一个好的关键点是一个角落。这首先来自 Harris 角工作和
我在 OpenCV 4.5.2 中使用 SIFT 特征检测器.通过调整 nOctaveLayers cv::SIFT::create() 中的参数, 我从 detectAndCompute() 得到这
我是一名优秀的程序员,十分优秀!