我已將這種Matlab Anisotropic擴散代碼轉換爲C++,但我沒有得到所需的輸出。我所得到的只是一個黑色的圖像。有人可以檢查我的代碼並提出任何建議嗎?下面是我的代碼:各向異性擴散
const double lambda = 1/7;
const double k = 30;
const int iter = 1;
int ahN[3][3] = { {0, 1, 0}, {0, -1, 0}, {0, 0, 0} };
int ahS[3][3] = { {0, 0, 0}, {0, -1, 0}, {0, 1, 0} };
int ahE[3][3] = { {0, 0, 0}, {0, -1, 1}, {0, 0, 0} };
int ahW[3][3] = { {0, 0, 0}, {1, -1, 0}, {0, 0, 0} };
int ahNE[3][3] = { {0, 0, 1}, {0, -1, 0}, {0, 0, 0} };
int ahSE[3][3] = { {0, 0, 0}, {0, -1, 0}, {0, 0, 1} };
int ahSW[3][3] = { {0, 0, 0}, {0, -1, 0}, {1, 0, 0} };
int ahNW[3][3] = { {1, 0, 0}, {0, -1, 0}, {0, 0, 0} };
Mat hN = Mat(3, 3, CV_32FC1, &ahN);
Mat hS = Mat(3, 3, CV_32FC1, &ahS);
Mat hE = Mat(3, 3, CV_32FC1, &ahE);
Mat hW = Mat(3, 3, CV_32FC1, &ahW);
Mat hNE = Mat(3, 3, CV_32FC1, &ahNE);
Mat hSE = Mat(3, 3, CV_32FC1, &ahSE);
Mat hSW = Mat(3, 3, CV_32FC1, &ahSW);
Mat hNW = Mat(3, 3, CV_32FC1, &ahNW);
void anisotropicDiffusion(Mat &output, int width, int height) {
//mat initialisation
Mat nablaN, nablaS, nablaW, nablaE, nablaNE, nablaSE, nablaSW, nablaNW;
Mat cN, cS, cW, cE, cNE, cSE, cSW, cNW;
//depth of filters
int ddepth = -1;
//center pixel distance
double dx = 1, dy = 1, dd = sqrt(2);
double idxSqr = 1.0/(dx * dx), idySqr = 1.0/(dy * dy), iddSqr = 1/(dd * dd);
for (int i = 0; i < iter; i++) {
//filters
filter2D(output, nablaN, ddepth, hN);
filter2D(output, nablaS, ddepth, hS);
filter2D(output, nablaW, ddepth, hW);
filter2D(output, nablaE, ddepth, hE);
filter2D(output, nablaNE, ddepth, hNE);
filter2D(output, nablaSE, ddepth, hSE);
filter2D(output, nablaSW, ddepth, hSW);
filter2D(output, nablaNW, ddepth, hNW);
//exponential flux
cN = nablaN/k;
cN.mul(cN);
cN = 1.0/(1.0 + cN);
//exp(-cN, cN);
cS = nablaS/k;
cS.mul(cS);
cS = 1.0/(1.0 + cS);
//exp(-cS, cS);
cW = nablaW/k;
cW.mul(cW);
cW = 1.0/(1.0 + cW);
//exp(-cW, cW);
cE = nablaE/k;
cE.mul(cE);
cE = 1.0/(1.0 + cE);
//exp(-cE, cE);
cNE = nablaNE/k;
cNE.mul(cNE);
cNE = 1.0/(1.0 + cNE);
//exp(-cNE, cNE);
cSE = nablaSE/k;
cSE.mul(cSE);
cSE = 1.0/(1.0 + cSE);
//exp(-cSE, cSE);
cSW = nablaSW/k;
cSW.mul(cSW);
cSW = 1.0/(1.0 + cSW);
//exp(-cSW, cSW);
cNW = nablaNW/k;
cNW.mul(cNW);
cNW = 1.0/(1.0 + cNW);
//exp(-cNW, cNW);
output = output + lambda * (idySqr * cN.mul(nablaN) + idySqr * cS.mul(nablaS) +
idxSqr * cW.mul(nablaW) + idxSqr * cE.mul(nablaE) +
iddSqr * cNE.mul(nablaNE) + iddSqr * cSE.mul(nablaSE) +
iddSqr * cNW.mul(nablaNW) + iddSqr * cSW.mul(nablaSW));
}
}
什麼是「理想輸出」? – user463035818
我沒有在任何地方看到變量'k'。 –
yoz在哪裏初始化過濾器內核? – Micka