我有一张视网膜照片的灰度缓冲图像。在使用 Sobel 和 Canny 算法处理后,我在图像周围留下了几条短线。这些较小的线条正在影响我创建的用于计算血管宽度的算法。我正在尝试编写一种算法或确定一种可用于删除长度短于 N 像素的所有行的算法。这应该可以清理图像并使我的算法更有效。有没有针对这类问题的算法?如果没有,有人可以建议从哪里开始吗?我创建了以下内容来跟踪单行,但它需要做很多工作:
public static IntImage cleanImage(IntImage imageIn) {
int width = imageIn.nCols, height = imageIn.nRows;
IntImage image = new IntImage(height, width);
image.setPixels(imageIn.getPixels().clone());
int currentX = 0, currentY = 0, currentValue = 0, count = 0, counter = 0;
int[][] locations = new int[50][2];
boolean connectionFound = false;
for(int row = 0; row < height-1; row++){
for(int col = 1; col < width-1; col++){
currentX=col;
currentY=row;
do{
if(image.getPixel(currentY, currentX)==255){
locations[count][0]=currentY;
locations[count][1]=currentX;
++count;
}else if(image.getPixel(currentY, currentX+1)==255){
locations[count][0]=currentY;
locations[count][1]=currentX+1;
++count;
currentX+=1;
}else if(image.getPixel(currentY+1, currentX+1)==255){
locations[count][0]=currentY+1;
locations[count][1]=currentX+1;
++count;
currentY+=1;
currentX+=1;
}else if(image.getPixel(currentY+1, currentX)==255){
locations[count][0]=currentY+1;
locations[count][1]=currentX;
++count;
currentY+=1;
}else if(image.getPixel(currentY+1, currentX-1)==255){
locations[count][0]=currentY+1;
locations[count][1]=currentX-1;
++count;
currentY+=1;
currentX-=1;
}else if(image.getPixel(currentY, currentX-1)==255){
locations[count][0]=currentY;
locations[count][1]=currentX-1;
++count;
currentX-=1;
}
}while(image.getPixel(currentY, currentX)==255 && count < 50);
if(count < 50){
for(int loop = 0; loop < 50; loop++){
image.setPixel(locations[loop][0], locations[loop][1], 0);
locations[loop][0]=0;
locations[loop][1]=0;
}
}
count = 0;
currentX = col;
currentY = row;
}
}
return image;
上面的代码是为了表明我正在尝试自己,但请不要像我说的那样太费心,因为它需要大量工作。Sobel 和 Canny 算法用于获取血管的轮廓,然后将图像转换为二值图像。那时可以看到所有其他线条。在此之前我无法处理图像。如果我只使用没有 sobel 的 Canny,它不会那么糟糕,但线条似乎更宽,因此这种方式不准确。这就是为什么我要移除较小的线条以确保容器边缘内的区域清晰可用于处理。不幸的是,我无法上传图片,因为我的声望至少需要十级。对不起。