
正文
高斯滤波java代码 高斯滤波算法原理
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
OpenCV-Python系列六:图像滤波
图像滤波是一种十分常见的图像处理手段。通常,你可以认为相邻位置像素是紧密联系的,它们共同来显示对某个物体,图像滤波则通过运算来排除图像中和周围相差大的像素。当然,这并不是绝对的, 有时候你为了评估图像的质量,也会将这些“特立独行”的像素作为选取的目标 。无论你采用什么方法,记住你要的目标就行,有时候你的目标可能是别人的背景。
滤波常常会使得图像变得模糊(非绝对),那么,为什么你需要将一幅清晰的图像变得模糊呢?下面的例子应该可以解释。
高斯滤波采用满足正态分布的核模板,其参数的主要参数是标准差σ,代表核的离散程度,σ值越小,模板中心系数与边缘系数差越大,平滑的程度越小。
高斯滤波对图像采集过程中由于不良照明/高温引起的传感器噪声信号有较好的效果,消除了图像中的高频信号。
由于得到的是一维的Gaussian Kernel,你可以采用下面的方式转为二维的
为了便于直观感受高斯滤波的效果,使用Canny算子来提取轮廓对比,你可以试试在特征提取前加高斯滤波对比。
补充说明:对于均值滤波,你也可以使用cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]])来实现,需要将normalize设置为True,当设置normalize为False时,实现的是将kernel内像素相加,官方文档做出的描述为:
中值滤波对图像中的脉冲型(椒盐等)噪声信号处理效果好,当 你的应用场景存在这种颗粒感的噪声信号时,中值滤波会是一种很好的选择 。它,选取kernel区域内像素点集的中值最为锚点的像素值,对类似投票机制中的最高分(高灰阶点)和最低分(过低灰阶点)影响有很好的抑制作用。
如果你的应用涉及到图像美化,双边滤波可以初步达到你的期望,关于双边滤波,这里不做展开,由你来探索,其函数参数信息如下。
对于opencv-python的图像滤波部分有问题欢迎留言, Have Fun With OpenCV-Python, 下期见。
相关问答
Q1: 求opencv中高斯函数的具体解析,初学者,希望每条语句都解释下哈
src和dst当然分别是输入图像和输出图像。Ksize为高斯滤波器模板大小高斯滤波java代码,sigma1和sigma2分别为高斯滤波在横线和竖向高斯滤波java代码的滤波系数。borderType为边缘扩展点插值类型
voidGaussianBlur( InputArray _src, OutputArray _dst, Size ksize,
double sigma1, double sigma2,
int borderType )
{
if( ksize.width == 1 ksize.height == 1 )
{
src.copyTo(dst);//如果滤波器核高斯滤波java代码的大小为1的话,则说明根本就不用滤波,输出矩阵与输入矩阵完全相同
return;
}
if( borderType != BORDER_CONSTANT )//当边缘扩展不是常数扩展时
{
if( src.rows == 1 )
ksize.height = 1;//如果输入矩阵是一个行向量,则滤波核的高强制为1
if( src.cols == 1 )
ksize.width = 1;//如果输入矩阵是一个列向量,则滤波核的宽强制为1
}
/*生成一个高斯滤波器引擎f*/
PtrFilterEngine f = createGaussianFilter( src.type(), ksize, sigma1, sigma2, borderType );
f-apply( src, dst );//调用引擎函数,完成将输入矩阵src高斯滤波为输出矩阵dst
}
Q2: 高斯滤波的模型建立
滤波器是建立的一个数学模型,通过它来将图像数据进行能量转化,能量低的就排除掉,噪声属于低能量部分。编程运算的话就是一个模板运算,拿图像的八连通区域来说,中间点的像素值就等于八连通区的像素值的均值,这样达到平滑的效果。假如使用理想滤波器,则会在图像中产生振铃现象。如果采用高斯滤波器,系统函数为平滑的,避免了振铃现象。
由于高斯函数的傅立叶变换仍是高斯函数, 因此高斯函数能构成一个在频域具有平滑性能的低通滤波器。可以通过在频域做乘积来实现高斯滤波。均值滤波是对信号进行局部平均, 以平均值来代表该像素点的灰度值。矩形滤波器(Averaging Box Filter)对这个二维矢量的每一个分量进行独立的平滑处理。通过计算和转化 ,得到一幅单位矢量图。这个 512×512的矢量图被划分成一个 8×8的小区域 ,再在每一个小区域中 ,统计这个区域内的主要方向 ,亦即将对该区域内点方向数进行统计,最多的方向作为区域的主方向。于是就得到了一个新的64×64的矢量图。这个新的矢量图还可以采用一个 3×3模板进行进一步的平滑。
Q3: 高斯滤波(低通滤波)在Origin里面能不能做 或者excel里面能不能做,求教!
int cuBandLimitPro(unsigned short* pSrc, unsigned short* pDst){
cuFloatComplex* hSrc;
cuFloatComplex* hDst;
cuFloatComplex* dData;
cufftHandle plan;
float temp;
int imgSize = imgWidth * imgHeight;
hSrc = (cuFloatComplex*)malloc(sizeof(cuFloatComplex) * imgSize);
hDst = (cuFloatComplex*)malloc(sizeof(cuFloatComplex) * imgSize);
cudaMalloc((void**) dData, sizeof(cuFloatComplex) * imgSize);
cufftPlan2d(plan, imgWidth, imgHeight, CUFFT_C2C);
for(int i = 0; i imgSize; i ++)
hSrc[i].x = pSrc[i];
cudaMemcpy(dData, hSrc, sizeof(cuFloatComplex) * imgSize, cudaMemcpyHostToDevice);
// FFT
cufftExecC2C(plan, (cuFloatComplex*)dData, (cuFloatComplex*)dData, CUFFT_FORWARD);
// Band-Stop Filter
// 这里按需求随便写点带阻、带通的东西。
// iFFT
cufftExecC2C(plan, (cuFloatComplex*)dData, (cuFloatComplex*)dData, CUFFT_INVERSE);
cudaMemcpy(hDst, dData, sizeof(cuFloatComplex) * imgSize, cudaMemcpyDeviceToHost);
for(int i = 0; i imgSize; i ++){
temp = hDst[i].x / imgSize / 4;
//temp = pFFTR[i][0] / 2;
if(temp 0)
pDst[i] = 0;
else if(temp cuBLMaxValue)
pDst[i] = cuBLMaxValue;
else
pDst[i] = (unsigned short)(temp + 0.5f);
}
cudaFree(dData);
free(hSrc);
free(hDst);
return 1;
}
高斯滤波java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于高斯滤波算法原理、高斯滤波java代码的信息别忘了在本站进行查找喔。







