我目前正在开发一个乳房X线摄影项目,我正在努力理解如何将图像分成两个部分:可搜索区域(ROI)和不可搜索区域。该问题的焦点仅针对实际图像分析/处理的基础算法。 Google和Stack Overflow的大部分结果都提供了有用的信息,但没有一个解释图像分析/处理的步骤,以及为什么这些步骤很重要以及它们各自正在做什么。
我编写了一个小代码段,用于拍摄图像,重新调整图像大小,并对图像进行“二值化”。 (下面。)有什么方法可以在我的二进制图像上跟踪一条线(轮廓?),将此线移动到我的原始图像,并将其用作使我的算法确定非可搜索区域(ROI)的指南可搜索的区域?有没有更简单的方法呢?
// ** Main ** //
int main( int argc, char** argv )
{
/// Load an image
src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
// Create Dummy Image
Mat destination;
destination = cvCreateMat(3328/5, 4084/5, CV_32FC1);
resize(src, destination,cvSize(3328/5,4084/5),0,0);
src = destination;
/// Create a matrix of the same type and size as src (for dst)
dst.create( src.size(), src.type() );
/// Create a window
namedWindow( window_name, CV_WINDOW_AUTOSIZE );
// Binarize the Image
threshold(src, dst, 128, 255,CV_THRESH_BINARY | CV_THRESH_OTSU);
// Show the Image
imshow( window_name, dst );
/// Wait until user exit program by pressing a key
waitKey(0);
return 0;
}
为了澄清和重申,我已经研究了很多教程,没有任何帮助,特别是。我很感激能得到的所有帮助!
答案 0 :(得分:2)
要在二值化图像上查找线条,您需要使用递归函数,并创建与您可以存储数据的图像大小相同的第二个数组。这是我最近编写的用于检测blob的代码示例一个二值化的图像(注意,这是在C#中,需要稍微改动,例如使用矢量<>而不是list)。
首先,分析一个像素,看看它是否值得追踪/未被追踪:
private List<Blob> FindBlobs(bool[] Data, int Width, int Height)
{
bool[] IsBlob = new bool[Data.Length];
List<Blob> Blobs = new List<Blob>();
for (int y = 0; y < Height; y++)
{
for (int x = 0; x < Width; x++)
{
if (Data[y * Width + x])
{
Blob b = new Blob();
TrackBlob(b, Data, x, y, Width, Height);
Blobs.Add(b);
}
}
}
return Blobs;
}
然后跟踪每个blob:
private void TrackBlob(Blob blob, bool[] Data, int x, int y, int Width, int Height)
{
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
if ((x + i) >= 0 && (x + i) < Width && (y + j) >= 0 && (y + j) < Height)
{
if (Data[(y + j) * Width + (x + i)])
{
Data[(y + j) * Width + (x + i)] = false;
blob.AddPoint((x + i), (y + j));
TrackBlob(blob, Data, x + i, y + j, Width, Height);
}
}
}
}
}
您可以轻松地调整这些以仅搜索直线(我不知道您是否需要圆形线)。然后使用线的交点来构建具有已知边线的对象。
或者,您可以使用Hough Lines和Circles(OpenCV中提供)来跟踪图像上的线条和圆圈。这样可以在任何方向上给出线条,但它不会给出直线的终点。