Mat CSobel::sobelFilter() { //Sobel X Filter double x1[] = { -1.0, 0, 1.0 }; double x2[] = { -2.0, 0, 2.0 }; double x3[] = { -1.0, 0, 1.0 }; vector<vector<double>> xFilter(3); xFilter[0].assign(x1, x1 + 3); xFilter[1].assign(x2, x2 + 3); xFilter[2].assign(x3, x3 + 3); //Sobel Y Filter double y1[] = { 1.0, 2.0, 1.0 }; double y2[] = { 0, 0, 0 }; double y3[] = { -1.0, -2.0, -1.0 }; vector<vector<double>> yFilter(3); yFilter[0].assign(y1, y1 + 3); yFilter[1].assign(y2, y2 + 3); yFilter[2].assign(y3, y3 + 3); int size = (int)xFilter.size() / 2; Mat filteredImg = Mat(gFiltered.rows - 2 * size, gFiltered.cols - 2 * size, CV_8UC1); angles = Mat(gFiltered.rows - 2 * size, gFiltered.cols - 2 * size, CV_32FC1); for (int i = size; i < gFiltered.rows - size; i++) { for (int j = size; j < gFiltered.cols - size; j++) { double sumx = 0; double sumy = 0; for (int x = 0; x < xFilter.size(); x++) for (int y = 0; y < xFilter.size(); y++) { sumx += xFilter[x][y] * (double)(gFiltered.at<uchar>(i + x - size, j + y - size)); sumy += yFilter[x][y] * (double)(gFiltered.at<uchar>(i + x - size, j + y - size)); } double sumxsq = sumx*sumx; double sumysq = sumy*sumy; double sq2 = sqrt(sumxsq + sumysq); if (sq2 > 255) sq2 = 255; filteredImg.at<uchar>(i - size, j - size) = sq2; if (sumx == 0) angles.at<float>(i - size, j - size) = 90; else angles.at<float>(i - size, j - size) = atan(sumy / sumx); } } return filteredImg; }
Image<typename promote_trait<T, float>::TP> sepFilter(const Image<T>& src, const float* hFilt, const float* vFilt, const int hfs, const int vfs, ConvolutionBoundaryStrategy boundary) { Image<typename promote_trait<T, float>::TP> result = src; if (hfs > 0) result = xFilter(result, hFilt, hfs, boundary); if (vfs > 0) result = yFilter(result, vFilt, vfs, boundary); return result; }