我试图在Matlab中实现快速角点检测算法,我知道已经有了一个预构建的版本。我不知道为什么我的实现似乎检测到那些甚至不接近边缘的特性,或者仅仅是糟糕的特性。
readImage1 = imread('img1.png');
im1 = rgb2gray(readImage1);
img1 = medfilt2(im1);
rowStart = 0.1 * size(img1, 1);
rowStart = fix(rowStart);
rowEnd = 0.9 * size(img1, 1);
rowEnd = fix(rowEnd);
colStart = 0.1 * size(img1, 2);
colStart = fix(colStart);
colEnd = 0.9 * size(img1, 2);
colEnd = fix(colEnd);读我的照片,表演中位蓝色。我只想要特征检测从图像边缘开始一定的距离。
array = [ ; ];
for c = colStart:colEnd
for r = rowStart:rowEnd
%get the intesity of the pixel
intensity = img1(r, c);
temp = [r,c];
intensity1 = img1((r+3), c);
intensity5 = img1(r+1, c+3);
intensity9 = img1(r-3, c);
intensity13 = img1(r+1, c-3);
threshold = 70;
count = IntensityCount(intensity1, intensity9, intensity5, intensity13, intensity, threshold);
if count >= 3
array = [array; temp];
end
end
end然后,对每个像素,将像素的强度与其4个最重要的邻居进行比较。如果检测到它为角,请将其保存到Nx2数组中。
之后,执行非最大抑制。
[rows, columns] = size(array);
discardArray = [ ; ];
for index = 2:rows
currX = array(index);
currY = array(index, 2);
prevX = array(index - 1);
prevY = array(index - 1, 2);
if(adjacencyCheck(currX, currY, prevX, prevY))
currScore = pixelScore(img1, currX, currY);
prevScore = pixelScore(img1, prevX, prevY);
if(currScore > prevScore)
temp = [prevX, prevY];
discardArray = [discardArray; temp];
else
temp = [currX, currY];
discardArray = [discardArray; temp];
end
end
end
discardArray = unique(discardArray, 'rows');
finalArray = setdiff(array,discardArray, 'rows');然后显示图像上的点。
[rows, columns] = size(finalArray);
for index = 1:rows
img1 = insertMarker(img1, [finalArray(index), finalArray(index,2)], 'x');
end
imshow(img1);用于强度检测和非最大抑制的函数。
function number = IntensityCount(int1, int9, int5, int13, origIntensity, thresh)
number = 0;
if abs(int1 - origIntensity) > thresh
number = number + 1;
end
if abs(int9 - origIntensity) > thresh
number = number + 1;
end
if abs(int5 - origIntensity) > thresh
number = number + 1;
end
if abs(int13 - origIntensity) > thresh
number = number + 1;
end
end
%Get the score by sum of absolute differences between the pixel and its neighbours.
function scoreNumber = pixelScore(img, r, c)
intOriginal = img(r,c);
intensity1 = img((r+3), c);
intensity3 = img(r+3, c-1);
intensity5 = img(r+1, c+3);
intensity7 = img(r-1, c+3);
intensity9 = img(r-3, c);
intensity11 = img(r-3, c-1);
intensity13 = img(r+1, c-3);
intensity15 = img(r-1, c-3);
scoreNumber = abs(intOriginal - intensity1) + abs(intOriginal - intensity3)+ abs(intOriginal - intensity5) + abs(intOriginal - intensity7) + abs(intOriginal - intensity9) + abs(intOriginal - intensity11) + abs(intOriginal - intensity13) + abs(intOriginal - intensity15);
end
%Check pixel adjacency using Euclidean distance.
function isAdjacent = adjacencyCheck(x1, y1, x2, y2)
xDist = x1 - x2;
yDist = y1 - y2;
dist = (xDist.^2 + yDist.^2).^0.5;
isAdjacent = dist <= 4;
end

为什么我的算法会发现这么多不好的特征?
发布于 2018-04-19 14:58:27
这是MATLAB语法中的一个不幸的困难,经常造成混淆。
如您所知,MATLAB将矩阵索引为[row,column],这在线性代数中是自然的,完全适合于矩阵。但是由于MATLAB已经扩展到线性代数之外,所以通常使用矩阵来存储空间数据,其中x沿矩阵的列增加,y沿行增加。因此,应该反转一个空间位置[x,y],以便在矩阵:[y,x]中找到索引。
insertMarker是一种函数,它以[x,y]的形式而不是索引的形式将空间位置取到矩阵中。因此,将[finalArray(index), finalArray(index,2)]切换到[finalArray(index,2), finalArray(index,1)]应该可以解决这个问题。
请注意,[finalArray(index,2), finalArray(index,1)]也可以编写为finalArray(index,[2,1])。
https://stackoverflow.com/questions/49912144
复制相似问题