我实际上已经从您创建的自定义内核中获得了输出。我使用Python OpenCV来完成这项工作,但调用OpenCV函数的方式基本相同。为了自包含,以下是我用Sobel和您的自定义内核调用图像的Python代码:
import cv2
import numpy as np
im = cv2.imread('Nj9fM.png');
out1 = cv2.Sobel(im, cv2.CV_16S, 0, 1, 3)
out1 = cv2.convertScaleAbs(out1.copy())
xVals = np.array([0.125,0,-0.125,0.25,0,-0.25,0.125,0,-0.125]).reshape(3,3)
out2 = cv2.filter2D(im, cv2.CV_32F, xVals, None, (-1,-1), 0, cv2.BORDER_DEFAULT)
out2 = cv2.convertScaleAbs(out2.copy())
cv2.imshow('Output 1', out1)
cv2.imshow('Output 2', out2)
cv2.waitKey(0)
cv2.destroyAllWindows()
在C ++方面:
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char* argv[])
{
Mat im = imread("Nj9fM.png", CV_LOAD_IMAGE_COLOR);
Mat out1, out2;
Sobel(img, out1, CV_16S, 1, 0, 3);
convertScaleAbs(out1, out2);
Mat xVals = Mat_<float>(3, 3) << 0.125, 0, -0.125, 0.25, 0, -0.25, 0.125, 0, -0.125;
filter2D(im, out2, -1, xVals, Point(-1,-1), 0 ,BORDER_DEFAULT);
convertScaleAbs(out2, out2);
imshow("Output 1", out1);
imshow("Output 2", out1);
waitKey(0);
destroyWindow("Output 1");
destroyWindow("Output 2");
}
如果您运行此代码,您将实际上看到两个图像,其中第一个使用内置的Sobel算子,而另一个使用您的自定义卷积核。我看到Sobel实现和您的梯度之间的主要区别在于,您通过将每个元素除以8来获取Sobel卷积核。因此,您检测到的任何梯度都会得到对比度降低,这就是我所看到的。实际上,您基本上是取梯度结果并除以8,因此您正在将输出的强度减少了8倍。尝试使用以下代码:
float xVals2[9] = {1f,0f,-1f,2f,0f,-2f,1f,0f,-1f};
实际的Sobel卷积核,然后再次运行您的代码。您应该会看到更高的对比度增强。对于Python,可以这样做:
xVals2 = np.array([1.,0.,-1.,2.,0,-2.,1.,0,-1.]).reshape(3,3)
同时在C++中:
Mat xVals2 = Mat_<float>(3, 3) << 1f, 0f, -1f, 2f, 0f, -2f, 1f, 0f, -1f;
如果您使用这个内核来运行代码,您会发现对比度更高了。但是你会注意到有更多的噪声,因为梯度值更大了。
float xVals [9] = {1f,0f,-1f,2f,0f,-2f,1f,0f,-1f};
实际 Sobel核,然后再次运行你的代码。你应该会看到更高的对比度提升。 - rayryeng