gpt4 book ai didi

image-processing - OpenCV:高效高斯差分

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:40 25 4
gpt4 key购买 nike

我正在尝试实现 difference of guassians (DoG),用于边缘检测的特定情况。正如算法名称所暗示的那样,它实际上相当简单:

Mat g1, g2, result;
Mat img = imread("test.png", CV_LOAD_IMAGE_COLOR);
GaussianBlur(img, g1, Size(1,1), 0);
GaussianBlur(img, g2, Size(3,3), 0);
result = g1 - g2;

不过,我觉得这可以更有效地完成。是否可以通过较少的数据传递来完成?

问题here教了我关于可分离过滤器的知识,但我是一个图像处理新手,无法理解如何在这种情况下应用它们。

谁能给我一些关于如何优化它的建议?

最佳答案

可分离滤波器的工作方式与普通高斯滤波器相同。当图像尺寸很大时,可分离滤波器比普通高斯更快。可以解析地形成滤波器内核,滤波器可以分成两个一维向量,一个水平和一个垂直。

例如..

考虑过滤器

1 2 1
2 4 2
1 2 1

此过滤器可以分为水平向量 (H) 1 2 1 和垂直向量 (V) 1 2 1。现在将这两个过滤器的集合应用于图像。矢量 H 应用于水平像素,V 应用于垂直像素。然后将结果加在一起得到高斯模糊。我提供了一个函数来执行可分离的高斯模糊。 (请不要问我评论,我太懒了:P)

Mat sepConv(Mat input, int radius)
{


Mat sep;
Mat dst,dst2;

int ksize = 2 *radius +1;
double sigma = radius / 2.575;

Mat gau = getGaussianKernel(ksize, sigma,CV_32FC1);

Mat newgau = Mat(gau.rows,1,gau.type());
gau.col(0).copyTo(newgau.col(0));


filter2D(input, dst2, -1, newgau);


filter2D(dst2.t(), dst, -1, newgau);


return dst.t();


}

改进高斯模糊计算的另一种方法是使用 FFT。如果数据量非常大,基于 FFT 的卷积比可分离核方法快得多。

快速谷歌搜索为我提供了以下功能

Mat Conv2ByFFT(Mat A,Mat B)
{
Mat C;
// reallocate the output array if needed
C.create(abs(A.rows - B.rows)+1, abs(A.cols - B.cols)+1, A.type());
Size dftSize;
// compute the size of DFT transform
dftSize.width = getOptimalDFTSize(A.cols + B.cols - 1);
dftSize.height = getOptimalDFTSize(A.rows + B.rows - 1);

// allocate temporary buffers and initialize them with 0's
Mat tempA(dftSize, A.type(), Scalar::all(0));
Mat tempB(dftSize, B.type(), Scalar::all(0));

// copy A and B to the top-left corners of tempA and tempB, respectively
Mat roiA(tempA, Rect(0,0,A.cols,A.rows));
A.copyTo(roiA);
Mat roiB(tempB, Rect(0,0,B.cols,B.rows));
B.copyTo(roiB);

// now transform the padded A & B in-place;
// use "nonzeroRows" hint for faster processing
Mat Ax = computeDFT(tempA);
Mat Bx = computeDFT(tempB);

// multiply the spectrums;
// the function handles packed spectrum representations well
mulSpectrums(Ax, Bx, Ax,0,true);

// transform the product back from the frequency domain.
// Even though all the result rows will be non-zero,
// we need only the first C.rows of them, and thus we
// pass nonzeroRows == C.rows
//dft(Ax, Ax, DFT_INVERSE + DFT_SCALE, C.rows);

updateMag(Ax);
Mat Cx = updateResult(Ax);

//idft(tempA, tempA, DFT_SCALE, A.rows + B.rows - 1 );
// now copy the result back to C.
Cx(Rect(0, 0, C.cols, C.rows)).copyTo(C);
//C.convertTo(C, CV_8UC1);
// all the temporary buffers will be deallocated automatically
return C;

}

希望这对您有所帮助。 :)

关于image-processing - OpenCV:高效高斯差分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14191967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com