私は分離可能なソベルフィルタ実装の独自の実装の作成に取り組んでいます。私の関数は入力としてkernelSize、ピクセルY1の勾配Yの水平フィルタ、ピクセルY2の勾配Yの垂直フィルタ、ピクセルX1の勾配Xの水平フィルタ、ピクセルX2の勾配Xの垂直フィルタがあります。分離可能なソベルフィルタの実装openCV C++
X1の入力された[1、0、-1](水平)
X2の入力された[1、2、1](垂直)
Y2の入力は[1、0 -1](垂直)
void gradientFilter1D(Mat& img, int kernelSize, vector<double> pixelsY1, vector<double> pixelsY2, vector<double> pixelsX1, vector<double> pixelsX2)
{
int sumMin = INT_MAX, sumMax = INT_MIN;
//gradient X
vector<vector<int>> pixelsX(img.rows, vector<int>(img.cols, 0));
//gradient Y
vector<vector<int>> pixelsY(img.rows, vector<int>(img.cols, 0));
vector<vector<int>> sumArray(img.rows, vector<int>(img.cols, 0));
for (int j = kernelSize/2; j < img.rows - kernelSize/2; j++)
{
for (int i = kernelSize/2; i < img.cols - kernelSize/2; i++)
{
double totalX = 0;
double totalY = 0;
//this is the horizontal multiplication
for (int x = -kernelSize/2; x <= kernelSize/2; x++)
{
totalY += img.at<uchar>(j, i + x) * pixelsY1[x + (kernelSize/2)];
totalX += img.at<uchar>(j, i + x) * pixelsX1[x + (kernelSize/2)];
//cout << int(img.at<uchar>(j, i + x)) << " " << pixelsY1[x + (kernelSize/2)] << endl;
}
pixelsX[j][i] = totalX;
pixelsY[j][i] = totalY;
}
}
for (int j = kernelSize/2; j < img.rows - kernelSize/2; j++)
{
for (int i = kernelSize/2; i < img.cols - kernelSize/2; i++)
{
double totalX = 0;
double totalY = 0;
//this is the vertical multiplication
for (int x = -kernelSize/2; x <= kernelSize/2; x++)
{
totalY += pixelsY[j + x][i] * pixelsY2[x + (kernelSize/2)];
totalX += pixelsX[j + x][i] * pixelsX2[x + (kernelSize/2)];
//cout << int(img.at<uchar>(j, i + x)) << " " << pixelsY1[x + (kernelSize/2)] << endl;
}
pixelsX[j][i] = totalX;
pixelsY[j][i] = totalY;
}
}
for (int j = 0; j < img.rows; j++)
{
for (int i = 0; i < img.cols; i++)
{
int sum;
sum = sqrt(pow(pixelsX[j][i], 2) + pow(pixelsY[j][i], 2));
sumArray[j][i] = sum;
sumMin = sumMin < sum ? sumMin : sum;
sumMax = sumMax > sum ? sumMax : sum;
}
}
//normalization
for (int j = 0; j < img.rows; j++)
for (int i = 0; i < img.cols; i++)
{
sumArray[j][i] = (sumArray[j][i] - sumMin) * ((255.0 - 0)/(sumMax - sumMin)) + 0;
img.at<uchar>(j, i) = sumArray[j][i];
}
}
私は正しいと分かっていれば、再びイメージを渡して、垂直の乗算を行いますか? – Vipoon