我有一张视网膜照片的灰度缓冲图像。在使用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算法用于获取血管的轮廓,然后将图像转换为二进制图像。此时可以看到所有其他线条。在此之前我无法处理图像。如果我只是在没有索贝尔的情况下使用Canny,那就不会那么糟糕,但线条看起来要宽得多,因此这种方式不准确。这就是为什么我想要移除较小的线条以确保容器边缘内的区域清晰可以进行处理。不幸的是我无法上传图片,因为我的声誉必须至少为10。遗憾。