功能型网站制作多少钱网站建设行业产业链分析
功能型网站制作多少钱,网站建设行业产业链分析,公司网站怎样制作,济南网站建设济南迄今为止#xff0c;看到的函数中#xff0c;卷积的操作发生在OpenCV函数的内部。理论上#xff0c;图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看#xff0c;它需要一个数组参数来描述内核。在实践层面#xff0c;有一个重要的微妙因素会对结…迄今为止看到的函数中卷积的操作发生在OpenCV函数的内部。理论上图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看它需要一个数组参数来描述内核。在实践层面有一个重要的微妙因素会对结果产生重大影响。微妙之处在于一些内核是可分离的而另一些则不是。图1图1A是可分离的; 它可以表示为两个一维卷积B和CD是一个不可分割内核的例子。可分离的内核是可以被认为是两个一维内核的内核首先与x内核进行卷积然后与y内核进行卷积来应用。这种分解的好处是内核卷积的计算成本大约是图像面积乘以内核区域。这意味着用n×n内核卷积区域A的图像需要时间与An2成正比同时n×1内核与图像卷积一次然后与1×n内核卷积占用与An An 2An成比例。即使n小于3也有好处随着n的增长优势更为突出。1、 利用filter2D()滤波鉴于图像卷积所需的操作次数是图像中像素的数量乘以内核中的像素数这可能需要很多计算因此在这种情况下最好让OpenCV来帮你完成并利用内部优化。OpenCV完成这些操作的函数是filter2D()cv::filter2D(cv::InputArray src, cv::OutputArray dst, int ddepth, cv::InputArray kernel, cv::Point anchor cv::Point(-1,-1), double delta 0, int borderType cv::BORDER_DEFAULT );创建一个适当大小的数组并用滤波器的系数填充它然后将它与源图像和目标图像一起传递到filter2D()中。可以使用ddepth指定结果图像的深度使用锚点指定滤波的锚点使用borderType指定边界类型。如果定义了锚点则内核可以是偶数大小否则它应该是奇数大小。如果要在应用滤波器后将总体偏移应用于结果则可以使用参数delta。2、 利用sepFilter2D分离滤波器 在内核可分离的情况下通过以分离的形式表示并将这些一维内核传递给OpenCV将从OpenCV获得最佳性能。sepFilter2D()与filter2D()类似除了它期望这两个一维内核而不是一个二维内核。cv::sepFilter2D(cv::InputArray src, cv::OutputArray dst, int ddepth, cv::InputArray rowKernel, cv::InputArray columnKernel, cv::Point anchor cv::Point(-1,-1), double delta 0, int borderType cv::BORDER_DEFAULT );sepFilter2D()的所有参数都与cv :: filter2D()的参数相同但使用rowKernel和columnKernel参数替换内核参数除外。后者为n1×1和1×n2阵列n1不一定等于n2。3、构建内核getDerivKernel()构造Sobel和Scharr内核getGaussianKernel()构造高斯内核。void cv::getDerivKernels(cv::OutputArray kx,cv::OutputArray ky,int dx, int dy, int ksize, bool normalize true, int ktype CV_32F );getDerivKernel()的结果放置在kx和ky参数中。内核Sobel和Scharr是可分离的内核将返回两个数组一个是1×ksize行系数kx另一个是ksize×1列系数ky。这些是从x和y导数阶dx和dy计算而来的。衍生内核总是方形的因此大小参数ksize是一个整数。ksize可以是1,3,5,7或cv ::SCHARR中的任何一个。normalize参数告诉getDerivKernels()是否应该对内核元素进行归一化。对于在浮点图像上操作的情况将normalize设置为true但是当正在操作整数数组时通常更为明智的做法是在一些数组之前不对数组进行归一化这样就不会丢掉以后需要的精度。最后一个参数ktype表示滤波器系数的类型。 ktype的值可以是CV_32F或CV_64F。高斯滤波器的实际内核数组由getGaussianKernel()生成。cv::Mat cv::getGaussianKernel(int ksize, // Kernel sizedouble sigma, // Gaussian half-widthint ktype CV_32F // Type for filter coefficients);与派生内核一样高斯内核是可分离的。因此getGaussianKernel()只计算一个ksize×1的系数数组。ksize的值可以是任何奇数正数。参数sigma设置近似高斯分布的标准偏差。根据以下函数从sigma计算系数也就是说计算系数α使得滤波器整体被归一化。可以将其设置为-1在这种情况下将根据ksize大小自动计算σ值。在这种情况下 例1是具体的使用方法从中能看出构造的每个卷积核的用途吗例1filter2D、sepFilter2D、getDerivKernels、getGaussianKernel功能演示。#include iostream
#include opencv2opencv.hpp
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{Mat src imread(E:/ img.bmp, 1);namedWindow(原始噪声图像, 0);imshow(原始噪声图像, src);//构造滤波器Mat kernal Mat::ones(3, 3, CV_32FC1);kernal/ 9;Mat filterDst;filter2D(src, filterDst, src.depth(), kernal);namedWindow(filter2D结果1, 0);imshow(filter2D结果1, filterDst);Mat kernal2 (Mat_char(3, 3) 0, -1, 0,-1, 5, -1,0, -1, 0);Mat dst1;filter2D(filterDst, dst1, src.depth(), kernal2);namedWindow(filter2D结果2, 0);imshow(filter2D结果2, dst1);Mat kx (Mat_float(1, 3) 0, -1, 0);Mat ky (Mat_float(1, 3) -1, 0, -1);sepFilter2D(filterDst, dst1, src.depth(), kx, ky);// , Point(-1, -1), 0, BORDER_DEFAULT);namedWindow(sepFilter2D结果, 0);imshow(sepFilter2D结果, dst1);getDerivKernels(kx, ky, 1, 1, 3, true);cout kx endl;cout ky endl;Mat dst2;sepFilter2D(filterDst, dst2, src.depth(), kx, ky);// , Point(-1, -1), 0, BORDER_DEFAULT);cv::normalize(dst2, dst2, 0, 255, NORM_MINMAX, CV_8UC1);namedWindow(sepFilter2D结果2, 0);imshow(sepFilter2D结果2, dst2);Mat gaussKernal;gaussKernal getGaussianKernel(7, -1);filter2D(src, filterDst, src.depth(), gaussKernal);namedWindow(Filter2D结果3, 0);imshow(Filter2D结果3, filterDst);waitKey(0);return 0;
}图2 操作结果示意图
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85624.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!