opencv对模糊图像处理_opencv处理模糊图像 - CSDN
  • 主要思想是先图像进行灰度化,然后用3x3的拉普拉斯算子进行滤波处理 再计算处理图像的均值和方差,将方差当做模糊检测的阈值选定标准即可。 相关的程序如下所示: #include #include #include #include ...

    在项目中的一个环节用到了模糊检测的相关内容

    主要思想是先对原图像进行灰度化,然后用3x3的拉普拉斯算子进行滤波处理

    再计算处理后图像的均值和方差,将方差当做模糊检测的阈值选定标准即可。

    相关的程序如下所示:

    #include <iostream>
    #include <opencv2\core\core.hpp>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    
    using namespace cv;
    using namespace std;
    
    bool blurDetect(Mat srcImage);
    
    int main()
    {
    	//读入图片
    	Mat img1 = imread("white1_1.bmp");
    
    	double time = (double)getTickCount();
    	bool flag = blurDetect(img1);
    	time = ((double)getTickCount() - time) / getTickFrequency();
    	cout << "所用时间为:" << time << "s" << endl;
    	system("pause");
    	return 0;
    }
    
    //模糊检测,如果原图像是模糊图像,返回0,否则返回1
    bool blurDetect(Mat srcImage)
    {
    
    	Mat gray1;
    	if (srcImage.channels() != 1)
    	{
    		//进行灰度化
    		cvtColor(srcImage, gray1, CV_RGB2GRAY);
    	}
    	else
    	{
    		gray1 = srcImage.clone();
    	}
    	Mat tmp_m1, tmp_sd1;	//用来存储均值和方差
    	double m1 = 0, sd1 = 0;
    	//使用3x3的Laplacian算子卷积滤波
    	Laplacian(gray1, gray1, CV_16S, 3);
    	//归到0~255
    	convertScaleAbs(gray1, gray1);
    	//计算均值和方差
    	meanStdDev(gray1, tmp_m1, tmp_sd1);
    	m1 = tmp_m1.at<double>(0, 0);		//均值
    	sd1 = tmp_sd1.at<double>(0, 0);		//标准差
    	//cout << "原图像:" << endl;
    	cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << endl;
    	if (sd1*sd1 < 400)
    	{
    		cout << "原图像是模糊图像" << endl;
    		return 0;
    	}
    	else
    	{
    		cout << "原图像是清晰图像" << endl;
    		return 1; 
    	}
    }


    展开全文
  • opencv3的图像模糊处理

    2017-05-09 10:11:02
    #include <opencv2/opencv.hpp>using namespace std; using namespace cv;//包含cv命名空间 int main() { Mat src_img = imread("C:\\test.png");//imread()函数载入图像 //从文件中读入图像,注意图像路径最好不要...
    #include <opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;//包含cv命名空间
    int main()
    {
    
        Mat src_img = imread("C:\\test.png");//imread()函数载入图像
        //从文件中读入图像,注意图像路径最好不要用相对路径,因为CLion生成的exe不在当前目录下。
        if(src_img.empty())
        {
            fprintf(stderr, "Can not load image\n");//如果读入图像失败,返回错误信息
            return -1;
        }
        //显示图像
        imshow("origin image and blur operation", src_img);//imshow()函数显示图像
        Mat des_img;
        blur(src_img,des_img,Size(7,7));//blur函数直接进行模糊化处理
        imshow("after blur operation",des_img);
        waitKey();//此函数等待按键,按键盘任意键就返回
        return 0;
    }
    展开全文
  • 本篇博客主要介绍如何使用OpenCV自带的归一化滤波器来图片进行处理,达到模糊图片的效果。

    本篇博客主要介绍如何使用OpenCV自带的归一化滤波器来对图片进行处理,达到模糊图片的效果。在代码中通过使用一个TrackerBar动态改变。具体的还是根据代码来进行解释吧:
    先看一下效果图:
    这里写图片描述这里写图片描述

    gif效果图虽然不清晰,但是可以很明显的通过拖动TrackerBar使得图片更加模糊或者清晰了,下面来看一下具体实现的代码:

    #include <iostream>
    #include <opencv2\opencv.hpp>
    using namespace cv;
    using namespace std;
    
    const char* source_window = "source";
    int initial_size = 1;
    Mat source, result;
    void onSizeChange(int position) {
        if (position == 0) {
            position = 1;
        }
        cout << "position" << position << endl;
        initial_size = position;
        try {
            blur(source, result, Size(initial_size, initial_size));
            imshow(source_window, result);
        }
        catch (Exception e) {
            std::cout << "Exception message = " << e.msg << std::endl;
        }
    }
    int main()
    {
        source = imread("fifth.jpg", IMREAD_UNCHANGED);
        result.create(source.rows,source.cols,source.channels());
        cvNamedWindow(source_window, CV_WINDOW_AUTOSIZE);
        cvCreateTrackbar("changeSize", source_window, &initial_size, 100, onSizeChange);
        cvSetTrackbarPos("changeSize", source_window, 0);
        waitKey(0);
        return 0;
    }
    

    主要实现模糊的代码就是blur(source, result, Size(initial_size, initial_size)),其中source是输入的图像,result是输出的图像,Size代表的是核窗口的大小,原有的像素点的通过计算将被核窗口内所有像素的均值取代,随意这个Size越大代表参与平均的像素点数量越多,反应到结果上就是原有像素的值可能变化更大,值受到影响越大。

    看一下相关理论方面的东西:
    平滑 也称 模糊, 是一项简单且使用频率很高的图像处理方法。
    平滑处理的用途有很多, 但是在本教程中我们仅仅关注它减少噪声的功用 (其他用途在以后的教程中会接触到)。
    平滑处理时需要用到一个 滤波器 。 最常用的滤波器是 线性 滤波器,线性滤波处理的输出像素值 (i.e. g(i,j)) 是输入像素值 (i.e. f(i+k,j+l))的加权和 :
    这里写图片描述
    h(k,l) 称为 核, 它仅仅是一个加权系数。
    不妨把 滤波器 想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口滑过图像。
    归一化块滤波器 (Normalized Box Filter)¶
    最简单的滤波器, 输出像素值是核窗口内像素值的 均值 ( 所有像素加权系数相等)
    核如下:
    这里写图片描述

    blur的函数原型:

    /** @brief Blurs an image using the normalized box filter.
    
    The function smoothes an image using the kernel:
    
    \f[\texttt{K} =  \frac{1}{\texttt{ksize.width*ksize.height}} \begin{bmatrix} 1 & 1 & 1 &  \cdots & 1 & 1  \\ 1 & 1 & 1 &  \cdots & 1 & 1  \\ \hdotsfor{6} \\ 1 & 1 & 1 &  \cdots & 1 & 1  \\ \end{bmatrix}\f]
    
    The call `blur(src, dst, ksize, anchor, borderType)` is equivalent to `boxFilter(src, dst, src.type(),
    anchor, true, borderType)`.
    
    @param src input image; it can have any number of channels, which are processed independently, but
    the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
    @param dst output image of the same size and type as src.
    @param ksize blurring kernel size.
    @param anchor anchor point; default value Point(-1,-1) means that the anchor is at the kernel
    center.
    @param borderType border mode used to extrapolate pixels outside of the image, see cv::BorderTypes
    @sa  boxFilter, bilateralFilter, GaussianBlur, medianBlur
     */
    CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                            Size ksize, Point anchor = Point(-1,-1),
                            int borderType = BORDER_DEFAULT );

    src: 输入图像
    dst: 输出图像
    Size( w,h ): 定义内核大小( w 像素宽度, h 像素高度)
    Point(-1, -1): 指定锚点位置(被平滑点), 如果是负值,取核的中心为锚点。

    好了,函数的注解也已经提供了,不知道我理解的对不对,如果有什么不正确的地方还请大神指正,我早点改正,不胜感激!!!有兴趣的朋友可以以关注我,遇到问题大家一起讨论一下!!

    这是我的微信公众号,如果可以的话,希望您可以帮忙关注一下,这将是对我最大的鼓励了,谢谢!!
    这里写图片描述

    代码地址:
    文件夹名字为Blur的那一个,不要点错了啊

    展开全文
  • 图像的模糊图像处理中比较常用和简单的处理手段之一。那么使用这种手段的原因就是为了给图像进行去噪,便于后面的处理。 模糊处理的背后的原理是什么呢,其实就是卷积计算。而在高等数学里面,卷积是连续的,在...

    图像的模糊是图像处理中比较常用和简单的处理手段之一。那么使用这种手段的原因就是为了给图像进行去噪,便于后面的处理。

    模糊处理的背后的原理是什么呢,其实就是卷积计算。而在高等数学里面,卷积是连续的,在图像处理中,我们所说的卷积是离散的。直接来上图你就清楚了卷积是怎么回事。

    你看是不是我们之前讲的图像的掩模很相似。简单的说,拿一个小方格在图像这个方格上进行滑动,其实这个和深度学习里面的卷积是差不多的原理。这样我们就可以得到一个新的图像了。

    所以你看,不同类型的模糊处理背后其实是对应不同的小方格,也就是俗称的滤波器或者卷积核。

    根据原理的不同,模糊方式有很多种,我们来介绍比较常用的几种。

    1、均值滤波。(blur)

         均值滤波从字面意思上就是取平均值,也就是黄色小方格上的系数全是1,与黄色窗体覆盖下的像素值相乘,再去除以9(卷积和大小为3*3),得到平均值,赋值给中心像素。

       它的 缺点是在去噪的同时,不能很好的保留图像细节,因为全用均值代替了。

    2、高斯滤波。

         相对于均值滤波,更好的保留图像的细节。因为高斯函数的特性,会有一定的权重配比。

    3、中值滤波。

          字面意思的话,就是取中间的值来代替中心像素。和均值滤波类似,只不过均值滤波是取平均值,中值滤波取中间的那个值。中值滤波可以有效的去除椒盐噪声(比如说你在清水中,撒点盐,这些就是椒盐噪声。对应到图像上,在一副黑色图像上,有很多小白点,这些就是椒盐噪声)。

    那么它为什么可以去除椒盐噪声呢。因为椒盐噪声像素值要么很小为0,要么很大为255,而取中间值话,就会用替代这些,从而给图像去噪点。

    4、双边滤波。

        那之前我们说过高斯滤波相对于均值模糊而言保留图像的一些细节,但是它是基于空阈的,就是基于空间分布的。但是它还是没有办法完全避免边缘信息的丢失。而双边滤波则是比高斯滤波多了一个高斯方差sigma-d,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。也就是说它们的像素值在设定落差之外,不给它进行模糊,比便于保留边缘。

    下面就是代码实现。

    1、均值滤波:

       Mat src=imread("D:\\test1.jpg");
        if(src.empty())
        {
           qDebug()<<"fail to load";
           return;
        }
        Mat blurDst;
        blur(src,blurDst,Size(3,3));
        imshow("blurDst",blurDst);
        imshow("src",src);
        waitKey(-1);

        结果如下:

         是不是感觉明显变得模糊了吧。

    2、高斯滤波。

    Mat src=imread("D:\\test1.jpg");
        if(src.empty())
        {
           qDebug()<<"fail to load";
           return;
        }
        Mat blurDst;
        GaussianBlur(src,blurDst,Size(3,3),11,11);
        imshow("GaussianDst",blurDst);
        imshow("src",src);
        waitKey(-1);

    结果如下:

    3、椒盐滤波。

    Mat src=imread("D:\\test2.png");
        if(src.empty())
        {
           qDebug()<<"fail to load";
           return;
        }
        Mat blurDst;
        medianBlur(src,blurDst,3);
        imshow("medianDst",blurDst);
        imshow("src",src);
        waitKey(-1);

    结果如下:

    我们可以看到,去掉了一些噪声,当然我们还可以调一下size的大小,看看效果。

    4、双边滤波。

       Mat src=imread("D:\\test2.png");
        if(src.empty())
        {
           qDebug()<<"fail to load";
           return;
        }
        Mat blurDst;
        bilateralFilter(src,blurDst,15,100,3);
        imshow("bilateralDst",blurDst);
        imshow("src",src);
        waitKey(-1);

      结果如下:

     

    总结:

    均值滤波无法克服边缘像素信息丢失的缺陷,原因是均值滤波是基于平均权重。

    高斯滤波虽然克服了均值滤波的缺陷,但是无法完全避免,因为没有考虑像素值得不同,只是基于空间分布考虑。

    双边滤波避免了边缘信息丢失,保留了图像的轮廓不变。

     

    展开全文
  • 图像模糊又称为图像平滑,是图像处理中最简单和常用的操作之一,使用该操作就是为了给图像降低噪音。图像模糊处理包括:高斯模糊、均值滤波、中值滤波、双边滤波等。模糊滤波其实就是图像的卷积计算,通常这些卷积...

    原理:

    图像模糊又称为图像平滑,是图像处理中最简单和常用的操作之一,使用该操作就是为了给图像降低噪音。图像模糊处理包括:高斯模糊、均值滤波、中值滤波、双边滤波等。模糊滤波其实就是图像的卷积计算,通常这些卷积算子都是线性计算,所以又叫线性滤波。

    图像的卷积计算

                       

                                  图1                                                   图2                                                   图3

    卷积过程,黄色区域(包含红色方框)成为卷积核,这是一个3*3的卷积核,灰色区域(其中部分被黄色区域覆盖)是一个6*6的图像像素,卷积核上的数值与其覆盖的灰色区域上相对应位置的数值进行相乘,最后将相乘得到的9个数值求和然后替换红色方块覆盖灰色模板上的像素值(也就是替换红色对应位置的原图像的像素。这样从左到右依次移动,不停地操作替换,每次移动一个方格,直到整个图像处理完成。注意和掩膜的区分。

    均值滤波

    将黄色卷积核覆盖的9个像素值求平均值代替红色方框位置的像素值。

    blur(src,dst,size(x,y),point(-1,-1))-第一个参数输入图像,第二个参数输出图像,第三个参数卷积核在x,y方向的大小,                   point默认参数值为(-1,-1)代表将均值赋给卷积核的中间位置

    中值滤波

    将黄色卷积核对应的9个像素值按照从小到大排序,用中间位置的数值代替红色方框位置处的像素值

    medianBlur(src,dst,ksize)-第一个参数输入图像,第二个参数输出图像,第三个参数卷积核大小

    高斯滤波

    https://www.cnblogs.com/wangguchangqing/p/6407717.html

    双边滤波

    https://blog.csdn.net/qq_36359022/article/details/80198890

    Robert算子

                                                       

    这两种都属于Robert的卷积核,即上面的黄色区域,只是处理的方向不同。

    Sobel算子

                                                         

    这两种都属于Sobel的卷积核,即上面的黄色区域,只是处理的方向不同。

    拉普拉斯算子

                                                         

    代码示例

    均值滤波和高斯滤波

    #include <opencv2/opencv.hpp> 
    #include <iostream> 
    using namespace cv;
    
    int main(int argc, char** argv) {
    	Mat src, dst;
    	src = imread("D:/test.png");
    	if (!src.data) {
    		printf("could not load image...\n");
    		return -1;
    	}
    	char input_title[] = "input image";
    	char output_title[] = "blur image";//均值滤波输出
    	namedWindow(input_title, CV_WINDOW_AUTOSIZE);
    	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
    	imshow(input_title, src);
    
    	blur(src, dst, Size(11, 11), Point(-1, -1));
    	imshow(output_title, dst);
    
    	Mat gblur;
    	GaussianBlur(src, gblur, Size(11, 11), 11, 11);
    	imshow("gaussian blur", gblur);//高斯滤波输出
    
    	waitKey(0);
    	return 0;
    }

    结果运行图

    从左到右依次是原图,均值滤波图,高斯滤波图

    双边滤波和中值滤波

    #include <opencv2/opencv.hpp> 
    #include <iostream> 
    using namespace cv;
    
    int main(int argc, char** argv) {
    	Mat src, dst;
    	src = imread("D:/test.png");
    	if (!src.data) {
    		printf("could not load image...\n");
    		return -1;
    	}
    	namedWindow("input image", CV_WINDOW_AUTOSIZE);
    	imshow("input image", src);
    
    	//medianBlur(src, dst, 3);//中值滤波
    	bilateralFilter(src, dst, 15, 100, 5);//双边滤波
    	namedWindow("BiBlur Filter Result", CV_WINDOW_AUTOSIZE);
    	imshow("BiBlur Filter Result", dst);
    
    	Mat resultImg;
    	Mat kernel = (Mat_<int>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    	filter2D(dst, resultImg, -1, kernel, Point(-1, -1), 0);//掩膜处理,图像增强
    	imshow("Final Result", resultImg);
    
    	waitKey(0);
    	return 0;
    
    }

    运行结果

    双边滤波图

    从左到右依次是原图、双边滤波图、滤波后图像增强图

    中值滤波结果图

     

    从左到右依次是原图、中值滤波图、滤波后图像增强图 

    展开全文
  • 平滑,也称为模糊,是一种简单且经常使用的图像处理操作。 平滑的原因有很多,下面将重点关注平滑以减少噪声。 要执行平滑操作,我们将图像应用滤镜。最常见的滤波器类型是线性的,其中输出像素的值(即G(i ,j )被...
  • Python-Opencv中的模糊处理 模糊处理原理 基于离散卷积、定义好每个卷积核、不同卷积核得到不同的卷积效果、模糊是卷积的一种表象 模糊方式: 均值模糊:一般用来处理图像的随机噪声 中值模糊:一般用来处理图像的...
  • OpenCV--模糊图像操作

    2017-11-29 21:36:02
    模糊操作时图像处理中最简单和常用的操作之一,使用该操作的原因之一就为了给图像预处理时减低噪声。 使用模糊操作的背后是数学的卷积计算: 其中权重核h(k,l)h(k,l)为“滤波系数”。上面的式子可以简记为: ...
  • Smooth/Blur(平滑和模糊) 是图像处理中最简单和常用的操作之一 使用该操作的原因之一就是为了给图像预处理时候降低噪声 , 把噪声与周围的数值平均一下就可以平滑噪声。 使用Smooth/Blur操作背后是数学的卷积计算 ...
  • 运动模糊产生:假设图像f(x,y)进行平面运动,x0(t)和y0(t)分别是在x和y方向上随时间变化的量。则有表达式如下,g(x,y)为转换后该点的灰度值,f(x,y)为原图中对应点的灰度值。 计算后的g(x,y)值将大于255,因此这里...
  • opencv2\opencv.hpp> #include<iostream> #include<math.h> using namespace cv; using namespace std; Mat src,dst, gblur; int main() { src = imread("C:/Users/asus/Desktop/tup....
  •  模糊操作时图像处理中最简单和常用的操作之一,该使用的操作之一原因就为了给图像预处理时减低噪声。 模糊操作的基本原理 - (数学的卷积运算)     其中权重核H(K,L)H(K,L)为“滤波系数”上面的式子...
  • 在进行一个和视频分析相关的项目研究的时候,我们需要前置使用OpenCV对图像进行预处理。在密集使用OpenCV的API的过程中,我们有了这样一种感觉:大部分人写的API都是ctrl+c 和 ctrl+v,而OpenCV的好多API,每一个API...
  • 虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理。 一、图像显示 这一步在...
  • opencv:图像模糊处理

    2017-08-11 08:55:18
    接口: blur(sourceImage,... // 图像模糊处理 示例代码: #include #include #include using namespace std; using namespace cv; int main(void) { //图像模糊操作 Mat src = imread("00
  • import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Size; import org.opencv.highgui.HighGui; import org.opencv.imgcodecs....
  • Python+opencv 图像模糊

    2018-09-20 23:14:01
    最近在学习OPencv进行图像处理,刚开始看的书是《数字图像处理》(冈萨雷斯matlab)版,后来做一个答题卡的项目需要使用到opencv学过的知识进行再次的温习和查缺补漏。 参考链接:...
  • Java OpenCV-4.0.0 图像滤波 /** * OpenCV-4.0.0 均值模糊 */ public void blur() { Mat src=Imgcodecs.imread(&amp;amp;quot;C:\\Users\\Administrator\\Downloads\\99.png&amp;amp;quot;); Mat ...
  • 模糊是基本的图像处理方法。 在介绍这两种方法之前先来介绍两种常见的噪声: 椒盐噪声 椒盐噪声是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声分为两种即胡椒噪声和盐噪声,胡椒...
  • OpenCV 中的图像处理

    2018-01-22 18:09:45
    • 你将学习如何对图像进行颜色空间转换,比如从BGR 到灰度图,或者从BGR 到HSV 等。 • 我没还要创建一个程序用来从一幅图像中获取某个特定颜色的物体。 • 我们将要学习的函数有:cv2.cvtColor(),cv2.inRange() ...
1 2 3 4 5 ... 20
收藏数 11,011
精华内容 4,404
关键字:

opencv对模糊图像处理