如果像素(可能)位于搜索的对称线上,则其(第一个/第二个/第三个/...)左右点相等(=> dG
,图1左),或者其(第一个/第二个/第三个/...)左(或右)值不同(=> dGs
,图1中)。
因此,感兴趣的点的特征是|dGs| - |dG|
的高值(=> dGs_dG
,图1右)。
如图1右侧的图像所示,仍存在许多误报。因此,将使用霍夫变换(图2左)来检测与最强线相对应的所有点(图2右)。绿色线确实是所搜索的线。
调整
更改n
:较高的值会丢弃更多的误报,但也会排除n
个边界像素。可以通过为边界像素使用较低的n
来避免这种情况。
更改阈值:对dGs_dG
的较高阈值会丢弃更多的误报。丢弃dG
的高值也可能有助于丢弃原始图像中的边缘位置。
对对称线的先验知识:使用霍夫变换的定义,可以丢弃所有通过图像中心部分的线。
![enter image description here](https://istack.dev59.com/zfeoY.webp)
用于生成这些图像的Matlab代码如下:
I = imread('bnuqb.png');
G = int16(rgb2gray(I));
n = 3;
dG = int16(zeros(size(G) - [0 2*n+2]));
dGs = int16(zeros(size(G) - [0 2*n+2]));
for i=0:n
dG = dG + abs(G(:, 1+n-i:end-2-n-i) - G(:, 3+n+i:end-n+i));
dGs = dGs + abs(G(:, 1+n-i:end-2-n-i) - G(:, 2+n:end-n-1));
end
dGs_dG = dGs - dG;
dGs_dG(dGs_dG < 0) = 0;
figure
subplot(1,3,1);
imshow(dG, [])
subplot(1,3,2);
imshow(dGs, [])
subplot(1,3,3);
imshow(dGs_dG, [])
BW = dGs_dG > 0;
[H,theta,rho] = hough(BW);
P = houghpeaks(H,1);
lines = houghlines(BW,theta,rho,P,'FillGap',50000,'MinLength',7);
figure
subplot(1,2,1);
imshow(H, [])
hold on
plot(P(:, 2),P(:, 1),'r.');
subplot(1,2,2);
imshow(I(:, n+2:end-n-1, :))
hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'g');
end
ffmpeg
相同的转换方式。我假设您正在使用VidStab
插件来进行ffmpeg操作?如果是这样,您可能在过程中生成了一个“transforms.trf”文件。我建议您研究一下该文件的格式,并从中提取值。 - Aaron稳定化的视频
。现在已经更新了问题。我正在使用deshake
插件,我使用的命令是ffmpeg.exe -i infile -vf deshake -c:v libx264 -crf 0 -preset veryslow outfile
。 - smttsp