• (1)第一个参数:输入图像(2)第二个参数:输出图像(3)第三个参数:颜色空间转换的标识符(具体见下表)(4)第四个参数:目标图像的通道数,若该参数为0,表示目标图像取源图像的通道数。cvtColor()函...

    颜色空间转换:cvtColor()   

    C++

    void  cvtColor(InputArray src, OutputArray dst, intcode, int dstCn = 0);

    (1)第一个参数:输入图像

    (2)第二个参数:输出图像

    (3)第三个参数:颜色空间转换的标识符(具体见下表)

    (4)第四个参数:目标图像的通道数,若该参数为0,表示目标图像取源图像的通道数。

    cvtColor()函数可以实现RGB颜色向HSVHSI等颜色空间转换,也可以转换为灰度图像。

    示例:

    cvtColor(srcImage,dstImage, COLOR_GRAY2BGR);     //转换原始图为灰度图

    OpenCV2CV_前缀的宏命名规范,被OpenCV3中的COLOR_式的宏命名前缀所取代。

    谨记:OpenCV默认的图片通道存储顺序是BGR,而不是RGB


    threshold ()

    通过遍历灰度图中点,将图像信息二值化,处理过后的图片只有二种色值。

     其函数原型如下:

    doublethreshold(InputArray src, OutputArray dst, double thresh, double maxval, inttype)

    参数信息:

    1)第一个参数,InputArray类型的src,输入数组,填单通道 , 832位浮点类型的Mat即可。

    2)第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。

    3)第三个参数,double类型的thresh,阈值的具体值。

    4)第四个参数,double类型的maxval,当第五个参数阈值类型type THRESH_BINARY THRESH_BINARY_INV阈值类型时的最大值.

    5)第五个参数,int类型的type,阈值类型,

     

    其它参数很好理解,我们来看看第五个参数,第五参数有以下几种类型

    0: THRESH_BINARY(二进制阈值)  当前点值大于阈值时,取Maxval(即第四个参数),否则设置为0

    1:THRESH_BINARY_INV(反二进制阈值)当前点值大于阈值时,设置为0,否则设置为Maxval

    2:THRESH_TRUNC (截断阈值)当前点值大于阈值时,设置为阈值,否则不改变

    3:THRESH_TOZERO (阈值化为0)当前点值大于阈值时,不改变,否则设置为0

    4:THRESH_TOZERO_INV  (反阈值化为0)当前点值大于阈值时,设置为0,否则不改变

    getRectSubPix函数

    函数作用:

    从原图像中提取提取一个感兴趣的矩形区域图像

    函数调用形式:

    C++: void getRectSubPix(InputArray image,Size patchSize, Point2f center, OutputArray patch,int patchType=-1 )

     

    参数理解:

    InputArray image:输入图像

    Size patchSize:获取矩形的大小

    Point2f center:获取的矩形在原图像中的位置

    OutputArray patch:表示输出的图像

    int patchType=-1 :表示输出图像的深度

    展开全文
  • 图像二值化操作 两种方法,全局固定阈值二值化和局部自适应阈值二值化 全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化; 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素...

    图像二值化操作

    两种方法,全局固定阈值二值化和局部自适应阈值二值化

    全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化;

    局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。

     

    #include<opencv2\opencv.hpp>   
    #include<opencv2\highgui\highgui.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char** argv)
    {
        Mat image = imread("moon.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意了,必须是载入灰度图
        if (image.empty())
        {
            cout << "read image failure" << endl;
            return -1;
        }
    
        // 全局二值化
        int th = 100;
        Mat global;
        threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
    
        // 局部二值化
        int blockSize = 25;
        int constValue = 10;
        Mat local;
        adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
    
        imshow("原始图",image);
        imshow("全局二值化", global);
        imshow("局部二值化", local);
    
    
        waitKey(0);
        return 0;
    }

    效果:

     

    腐蚀操作

    //3.腐蚀操作
    int main()
    {
    	Mat SrcPic = imread("dog.jpg");
    	imshow("原图", SrcPic);
    	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函数返回的是指定形状和尺寸的结构元素
    	Mat DstPic;
    	erode(SrcPic, DstPic, element); //腐蚀操作
    	imshow("腐蚀效果图", DstPic);
    	waitKey(0);
    	return 0;
    }

     

    滤波操作,模糊处理

    模糊处理在边沿检测和去噪声方面有较为广泛的应用。OpenCV中提供了4种模糊算法,列举如下:

    • average
    • median
    • gaussian
    • bilateral

    这里我们只列举使用 均值滤波实现图像模糊:

    int main()
    {
    	Mat SrcPic = imread("dog.jpg");
    	imshow("原图", SrcPic);
    	Mat DstPic;
    	blur(SrcPic, DstPic, Size(7, 7));
    	imshow("均值滤波", DstPic);
    	waitKey();
    	return 0;
    }
    

     

    更多模糊操作见这里

     

    canny边缘检测

    将原始图像转化为灰度图,用blur函数进行图像模糊以降噪,然后用canny函数进行边缘检测。

    
    //canny边缘检测
    int main()
    {
    	Mat SrcPic = imread("dog.jpg");
    	imshow("原图", SrcPic);
    	Mat DstPic, edge, grayImage;
    
    	//创建与src同类型和同大小的矩阵
    	DstPic.create(SrcPic.size(), SrcPic.type());
    
    	//将原始图转化为灰度图
    	cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY);
    
    	//先使用3*3内核来降噪
    	blur(grayImage, edge, Size(3, 3));
    
    	//运行canny算子
    	Canny(edge, edge, 3, 9, 3);
    
    	imshow("边缘提取效果", edge);
    
    	waitKey();
    	return 0;
    }
    

     

    直方图均衡化

    //6.直方图均衡化
    int main()
    {
    	Mat img = imread("dog.jpg");
    	imshow("原始图", img);
    	Mat dst;
    	cvtColor(img, img, CV_RGB2GRAY);
    	imshow("灰度图", img);
    	equalizeHist(img, dst);
    
    	imshow("直方图均衡化", dst);
    
    	waitKey(0);
    
    }

    显然均衡化后的图片对比度变高了,变得更加明亮!

    最后简单总结一下图像处理中概念

    离散傅里叶变换

    图像高频部分代表了图像的细节、纹理信息;低频代表了图像的轮廓信息

    低通-》模糊

    高通-》锐化

    腐蚀和膨胀是针对白色部分(高亮部分)而言的。膨胀就是对图像高亮部分进行“领域扩张”,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。

    开运算:先腐蚀再膨胀,用来消除小物体

    闭运算:先膨胀再腐蚀,用于排除小型黑洞

    形态学梯度:就是膨胀图与腐蚀图之差,用于保留物体的边缘轮廓

    顶帽:原图像与开运算图之差,用于分离比邻近点亮一些的斑块。

    黑帽:闭运算与原图像之差,用于分离比邻近点暗一些的斑块。

     

     

     

     

    展开全文
  • 目录 ...目的在于方便图像处理人员在具体编写OpenCV程序前,提前能够对图像进行简单处理,进而帮助开发人员分析该如何对图像进行处理。 使用C#对界面和逻辑进行开发。界面开发的工具有很多,例如使...

    目录

    1 任务与目的

    2 方案总体设计

    3 C#界面设计

    4 OpenCVSharp功能实现

    5 打包与运行

    6 总结


    1 任务与目的

    本次任务是设计一个能够实现OpenCV部分功能的图像处理软件。目的在于方便图像处理人员在具体编写OpenCV程序前,提前能够对图像进行简单处理,进而帮助开发人员分析该如何对图像进行处理。

    使用C#对界面和逻辑进行开发。界面开发的工具有很多,例如使用C++与QT进行开发。OpenCV针对C++有专用的库,与QT也有良好的支持,但是开发时间与C#比较长,并且生成的应用程序安装包较大。不光是OpenCV相关的库文件需要打包进应用程序安装包,还有QT界面相关的库文件也需要添加。过大的应用程序相当于简单的功能,两者并不协调,所以使用C#进行界面逻辑的开发更为快捷方便。

    使用OpenCVSharp实现图像处理功能。在目前针对C#的计算机视觉库主要有两种,EmguCV和OpenCVSharp。EmguCV的优势在于不仅仅提供了计算机视觉函数接口并且提供了一系列界面控件接口,但目前只支持OpenCV1的书写风格。但是是通过把C++封装成动态链接库在C#中调用,这样在修改算法的过程中就会非常的不方便,封装DLL的时候也比较麻烦。对于OpenCVSharp的工具,从名字就可以看出其是OpenCV提供给C#的接口。OpenCVSharp是OpenCV的.NET wrapper,它比EmguCV更接近于原始的OpenCV。网上常见的免费版EmguCV则是GUN协议,任何发表都需要至少公布你的源代码,相比之下OpenCVSharp则是相对温和多的LGUN协议,对商业应用友好(基本上相当于BSD)。OpenCVSharp提供了OpenCV和OpenCV2两种书写风格。因此设计使用OpenCVSharp进行图像处理的功能实现。

    以下是方案对比表:

                                                                                    表1-1 不同方案对比表

    开发方案对比

    C#

    C++&QT

    原始OpenCV

    \

    界面开发速度较快

    库文件调用方便

    安装包大

    商业友好

    EmguCV

    界面开发速度快

    库文件调用不方便

    安装包较大

    商业不友好

    \

    OpenCVSharp

    界面开发速度快

    库文件调用方便

    安装包较小

    商业友好

    \

     

    因此选用C#与OpenCVSharp搭配在VS2017下进行图像处理软件的开发。


    2 方案总体设计

     设计的应用程序用于进行简单的图像处理功能,因此考虑包含以下功能:

                                                                                      表2-1 设计功能表

    功能

    基本方法

    打开图片

    C#中OpenFileDialog控件

    保存图片

    C#中SaveFileDialog控件

    开\关摄像头

    OpenCVSharp的VideoCapture方法

    图像处理功能选择

    C#中ListBox控件

    图像处理

    OpenCVSharp的各类图像处理方法

    图像显示

    C#中PictureBox控件

    图像处理步骤队列

    C#中ListBox控件

    消息通知

    C#中TextBox控件

    图像处理功能参数调整

    C#中NumericUpDown控件

    要实现以上各项功能,除了使用表中第二列所示的基本方法外,还需要将C#控件与OpenCVSharp中的各类图像处理方法紧密联系。

    设计将图像处理功能选择ListBox与OpenCVSharp的各类图像处理方法一一对应,而方法的各项参数统一存放在一个多维数组里,C#中NumericUpDown控件在执行图像处理功能参数调整的时候通过调取这个多维数组,来实现修改参数的功能。用户通过点击选择图像处理功能,对图像处理步骤队列ListBox中的元素进行添加,程序内部通过判断这些元素及其排列,选择对应的OpenCVSharp图像处理方法对图像进行处理。

    这些步骤的简化示意图如下:

     

                                                                               图2-1 设计相关示意图

    以下将详细介绍C#界面的设计和OpenCVSharp功能实现。


     

    3 C#界面设计

     

    在一个C#窗体中添加需要的控件,主要包括:按键(Button)、列表(ListBox)、图像显示窗(PictureBox)、文字显示窗(TextBox)等。对各控件属性进行设置,例如按键名称、功能选择列表元素等。

    程序由个人独立开发,设计一个独特的图标和应用程序名称,由本人命名为“sa蛋OpenCV试验器”。

    显示效果如图所示:

                                                                                  图3-1 主C#窗体控件布局效果

    布局与界面效果设计完成后,对各个控件进行逻辑编程。

    • 打开图片

    打开图片功能与摄像头功能同时开启并不方便图像显示,因此当摄像头开启时,点击“打开图片”按键不弹出文件选择界面,同时在“通知消息显示”中通知应先关闭摄像头再打开图片。打开文件功能由C#的OpenFileDialog类实现,相关程序如下图所示:

                                                                           图3-2 打开图片功能部分程序图

    选择要打开的文件后,OpenFileDialog类的FileName变量会返回文件地址。

    • 保存图片

    保存图片功能实现与打开图片步骤类似。

    • 打开摄像头

    点击“打开摄像头”按钮后,会触发此按钮的点击事件,从而执行如下程序:

    private void button3_Click(object sender, EventArgs e)
    
    {
    
    camera = new VideoCapture(0);
    
    cameraopen = true;

    VideoCapture为OpenCVSharp所提供的摄像头类,可以方便快捷地开启摄像头;cameraopen为自定义的bool型标识符,由于表示摄像头是否已开启。

    • 关闭摄像头

    关闭摄像头代码如下:

    private void button4_Click(object sender, EventArgs e)
    
    {
    
    if(cameraopen == true)
    
    {
    
      camera.Dispose();
    
      cameraopen = false;

    使用VideoCapture类的Dispose()方法即可关闭摄像头。

    • 使用说明

    点击“使用说明”按钮弹出一个消息显示窗体,此窗体由C#的MessageBox类实现,程序如下:

    private void button7_Click(object sender, EventArgs e)
    
    {
    
    MessageBox.Show("此为传感器理论与研究方法……",  "使用说明", MessageBoxButtons.OK);
    
    }

    MessageBox类的Show()方法的第一个参数为显示消息内容,第二个参数为窗体标题,第三个参数为窗体添加的按键,此窗体添加一个确定按钮。

    显示效果如图:

                                                                图3-3 使用说明功能

    • 刷新图像

    点击“刷新图像”后,执行以下程序:

    image1 = new Mat(my_imagesource);
    
    image2 = new Mat();
    
    image2 = myOPENCV_run(image1, image2);//运行

    主要通过myOPENCV_run()方法将打开的图像进行处理,此方法为自定义方法,用于执行OpenCVSharp图像处理功能,在第四节详细说明。

    • 图像显示

    点击“图像显示”后,执行以下程序:

    pictureBox1.Image = image2.ToBitmap();

    MAT类的ToBitmap()方法,作用是将一个MAT图转换为正常可以显示的图片,传给PictureBox进行显示。

    • 通知消息显示

    通知消息使用TextBox控件,通知消息需要能够翻阅,即每次通知消息都是接着已有的通知信息进行添加。程序如下:

    textBox1.AppendText("\r\n图片刷新完成!");
    
    textBox1.SelectionStart = this.textBox1.TextLength;
    
    textBox1.ScrollToCaret();

    TextBox类的AppendText()方法用于添加文字信息,SelectionStart用来将光标移至最后,使用ScrollToCaret()方法使TextBox始终保持显示最新一行的文字。

    • 功能选择列表

    点击左侧列表进行功能选择,首先弹出对应功能的参数设置界面,设计第二个窗体用于设置参数。如下图所示:

                                                                                图3-4 设置参数界面

    每项功能都对应有四个参数,定义一个数组用于存放这些参数,数组的行下标就是对应的枚举过的参数名。数组定义如下:

    public static int[,] myOPENCV_value = new int[60 , 4]; //用于存放各方法中的参数

    当点击确定时,数组的参数被修改为设定值,同时此窗体,将选择的元素添加进图像处理列表。

    • 图像处理步骤列表

    图像处理需要按使用者选择的功能顺序进行执行,是一个有序的操作。重新定义一个数组专门用来存放使用者选择出来的功能参数,与功能列表定义的数组不同的是,前者要多一列用来存放功能对应的序号,其他均相同。这样的作用是,可以对数组存放序号的列进行依次检索,从而能够按使用者选择的顺序进行执行图像处理功能。此数组定义如下:

    public  int[,] myOPENCV_runlist = new int[20, 5];//运行步骤列表,与myOPENCV_value不同的是,运行步骤限定为20步,列的第一个元素存放运行功能序号

    点击图像处理步骤列表的元素,同样弹出参数设置窗口。这时将窗体的删除按钮等显现,实现对已经选择功能的删除功能。删除或中间插入其他功能都需要对列表元素进行添加或删除,与此同时也要对数组的行元素进行删除或插入。使用循环即可完成上述步骤。

     

    至此已大致介绍完实现此软件界面使用的逻辑和方法,下面介绍录入应用程序的部分OpenCVSharp图像处理功能实现。

     

     

    4 OpenCVSharp功能实现

    初始设想能够实现60种以上的基本图像处理功能,由于设计开发的时间有限,个人的能力水平也有待提高,因此只添加了较为基础的27种功能。

    功能名称与OpenCVSharp中对应方法如下表:

                                                                              表4-1 录入的OpenCVSharp功能名称表

    功能      

    OpenCVSharp中对应方法(函数)名称

    颜色空间转换

    CvtColor

    方框滤波

    BoxFilter

    均值滤波

    Blur

    高斯滤波

    GaussianBlur

    中值滤波

    MedianBlur

    双边滤波

    BilateralFilter

    膨胀

    Dilate

    腐蚀

    Erode

    高级形态学变换

    MorphologyEx

    漫水填充

    FloodFill

    尺寸放大

    PyrUp

    尺寸缩小

    PyrDown

    尺寸调整

    Resize

    固定阈值化

    Threshold

    边缘检测CANNY

    Canny

    边缘检测SOBEL

    Sobel

    边缘检测LAPLACIAN

    Laplacian

    边缘检测SCHARR

    Scharr

    图像快速增强

    ConvertScaleAbs

    图像融合

    AddWeighted

    霍夫标准变换

    HoughLines

    霍夫累计概率变换

    HoughLinesP

    霍夫圆变换

    HoughCircles

    重映射

    Remap

    仿射变换

    WarpAffine

    直方图均衡化

    EqualizeHist

    人脸识别

    DetectFace

     

    上表功能均单独进行了实现,通过检索图像处理步骤数组myOPENCV_runlist时,依次判断其每一行的第一个元素,其中存放的为对应功能的序号(序号为已经枚举化的功能名称)。通过依次识别出的序号,一步一步执行对应的图像处理功能,这一步骤由一个for循环加一个大型的switch-case实现,部分代码如下:

    for (int i = 0 ; i< listBox2.Items.Count ; i++)
    
    {
    
        switch((myOPENCV)myOPENCV_runlist[i,0])
    
               {
    
                 case myOPENCV.cvt_color: // myOPENCV为一个自定义枚举类型

    执行对应图像处理方法时,将数组保存的参数带入,即可实现功能的参数使用。


     

    5 打包与运行

     

    在VS2017中使用Microsoft Visual Studio Installer Project生成一个安装包工程,在工程中对使用到的库文件、图片、数据等进行添加。如下图所示:

                                                                                               图5-1 安装包工程

    在项目属性中设置安装文件名称、快捷方式、文件夹等。进行完上述步骤后即可生成一个安装包文件。由于添加了使用到的所有库文件,因此其他Windows用户安装完后,大部分也可以正常使用。

    安装后虽然能够正常使用,但并不符合“小巧便捷”的最初设想。因此使用Enigma Virtual Box打包软件将安装后的程序目录进行再次打包,生成一个可以直接执行无需安装的exe文件。如下图所示:

     

                                                                                     图5-2 可直接执行的exe文件

     

    至此设计基本完成,下面对软件进行简单测试:

    1. 点击“打开图片”按钮,选择一张图片后即可在图像显示区域显示选择的图片。
    2. 左侧列表点击选择“人脸识别”,弹出参数设置界面,直接点击“确定”即可添加“人脸识别”功能至右侧列表。
    3. 点击“刷新图片”按钮,即可观察是否成功识别出图像中的人脸。
    4. 观察下方通知栏显示的通知消息,与操作步骤一一对应。

    效果图如下:

     

                                                                                        图5-3 测试人脸识别

     

    需要注意的是,部分功能对输入的图像有严格要求,例如“直方图均衡化”需要输入一个单通道的图像,这时需要先进行“颜色空间转换”,将图像转换为灰度图后再进行下一步操作。若不按要求添加功能,多数会导致程序出错。

     


    6 总结

     

    至此project已经暂时完成,其实还有很多的设想都没来得及实现,比如如何在程序出错时不会崩溃、如何优化参数设置界面、如何添加更多更有用的图像处理功能。

    展开全文
  • opencv中文网站(介绍详细,目录清晰,不多) 图像颜色空间变换: 图像在不同的颜色空间有可能会突出不同的特征,比如这里进行了RGB HSV GRAY YCRCB颜色空间的变换 img_BGR = cv2.imread(img_path) # BGR plt....

    一个缺陷检测数据集:德国的DAGM2007
    opencv中文网站(介绍详细,目录清晰,不多)

    图像颜色空间变换:

    图像在不同的颜色空间有可能会突出不同的特征,比如这里进行了RGB HSV GRAY YCRCB颜色空间的变换

    img_BGR = cv2.imread(img_path) # BGR 
    plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')
    
    img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
    plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')
    
    img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
    plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')
    
    img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
    plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')
    
    img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
    plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')
    
    img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
    plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')
    
    img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
    plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')
    
    img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
    plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')
    
    img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
    plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')
    
    

    图像自适应阈值:

    通过自适应阈值的选取可以实现类似滤波以及目标图像剥离的效果。
    图像自适应阈值参考博客

    图像的膨胀、腐蚀以及礼帽等形态学操作

    形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。

    最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
    消除噪声
    分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
    寻找图像中的明显的极大值区域或极小值区域。

    # 一个礼帽的代码,可同样实现边缘的提取
    img = cv2.imread(img_path2,0)
    
    #用numpy生成卷积核
    kernel = np.ones((5,5),np.uint8)
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    
    plt.imshow(tophat)
    

    图像的梯度计算-拉普拉斯算子,sobel算子:

    主要可以提取到图像的边缘特征,包括横向的纵向的,以及两者结合的,对于边缘的提取以及裂纹的提取效果还算可以。
    
    def laplacian_demo(img):
        dst = cv.Laplacian(img, cv.CV_32F)
        kennel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
        dst = cv.filter2D(img, cv.CV_32F, kernel=kennel)
        lpls = cv.convertScaleAbs(dst)
        plt.imshow(lpls)
    
    def laplacian_plus_demo(img):
        dst = cv.Laplacian(img, cv.CV_32F)
        kennel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
        dst = cv.filter2D(img, cv.CV_32F, kernel=kennel)
        lpls = cv.convertScaleAbs(dst)
        plt.imshow(lpls)
    
    def sobel_demo(img):
        kennel_x = np.array([[-1, 0, 1], [-2, 0 ,2], [-1, 0, 1]])
        kennel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
        grad_x = cv.filter2D(img, cv.CV_32F, kernel=kennel_x)
        grad_y = cv.filter2D(img, cv.CV_32F, kernel=kennel_y)
        gradx = cv.convertScaleAbs(grad_x)
        grady = cv.convertScaleAbs(grad_y)
        #plt.imshow(gradx)
        #plt.imshow(grady)
        gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
        plt.imshow(gradxy)
    
    def scharr_demo(img):
        kennel_x = np.array([[-3, 0, 3], [-10, 0 ,10], [-3, 0, 3]])
        kennel_y = np.array([[-3, -10, -3], [0, 0, 0], [3, 10, 3]])
        grad_x = cv.filter2D(img, cv.CV_32F, kernel=kennel_x)
        grad_y = cv.filter2D(img, cv.CV_32F, kernel=kennel_y)
        gradx = cv.convertScaleAbs(grad_x)
        grady = cv.convertScaleAbs(grad_y)
        #plt.imshow(gradx)
        #plt.imshow(grady)
        gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
        plt.imshow(gradxy)
    
    

    图像的频域滤波和傅里叶变换:

    图像也可以进行二维的频域转换等,可以实现高低频的滤波,一般来说细节总是存在于高频信号中的,就像是之前做的小波变换一样。
    参考资料

    图像分割算法:

    各类分割算法总结

    分割/提取 图像中的目标区域 (可根据此关键词进行搜索)

    总结:

    根据这些传统的算法,可以得到一些有用的图像边缘信息,这些信息也是有用的,可能会对模型有大的帮助,但是后续如何用还要继续深入了解,目前的想法,把sobel算子滤波后的图像进行yolo计算,看能否直接圈出目标区域。

    展开全文
  • 1.有一个小游戏,就给出两张内容几乎差不多全部相同的图像,让大家在最快的时间内找出两个图像中有几处不同地方,我这里试着用OpenCV实现这个功能。 2.我的编程环境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3...

    前言

    1.有一个小游戏,就给出两张内容几乎差不多全部相同的图像,让大家在最快的时间内找出两个图像中有几处不同地方,我这里试着用OpenCV实现这个功能。
    2.我的编程环境是Windows 7 64位,IDE是VS2015,配置了OpenCV3.3与OpenCV_Contrib,实现语言是C++。是于如果配置以上的环境,可以看我之前写的博文。

    一、资源准备

    可以在网上搜《图片大找茬》,然后下载两张相似的图像,但图像的大小必须一样。下面是我指用的两张图像。如果不一样,就用resize()这个函数去调整两张图像的尺寸。

    在这里插入图片描述
    在这里插入图片描述

    二、代码演示

    1.这里用到的是OpenCV图像基本运算,两图相减。使用的API是subtract()。
    代码是传入两张图像

    void imageSubtract(Mat &image1, Mat &image2)
    {
    	if ((image1.rows != image2.rows) || (image1.cols != image2.cols))
    	{
    		if (image1.rows > image2.rows)
    		{
    			resize(image1, image1, image2.size(), 0, 0, INTER_LINEAR);
    		}
    		else if (image1.rows < image2.rows)
    		{
    			resize(image2, image2, image1.size(), 0, 0, INTER_LINEAR);
    		}
    	}
    
    	Mat image1_gary, image2_gary;
    	if (image1.channels() != 1)
    	{
    		cvtColor(image1, image1_gary, COLOR_BGR2GRAY);
    	}
    	if (image2.channels() != 1)
    	{
    		cvtColor(image2, image2_gary, COLOR_BGR2GRAY);
    	}
    
    	Mat frameDifference, absFrameDifferece;
    	Mat previousGrayFrame = image2_gary.clone();
    	//图1减图2
    	subtract(image1_gary, image2_gary, frameDifference, Mat(), CV_16SC1);
    
    	//取绝对值
    	absFrameDifferece = abs(frameDifference);
    
    	//位深的改变
    	absFrameDifferece.convertTo(absFrameDifferece, CV_8UC1, 1, 0);
    	imshow("absFrameDifferece", absFrameDifferece);
    	Mat segmentation;
    	
    	//阈值处理(这一步很关键,要调好二值化的值)
    	threshold(absFrameDifferece, segmentation,100, 255, THRESH_BINARY);
    
    	//中值滤波
    	medianBlur(segmentation, segmentation, 3);
    
    	//形态学处理(开闭运算)
    	//形态学处理用到的算子
    	Mat morphologyKernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    	morphologyEx(segmentation, segmentation, MORPH_CLOSE, morphologyKernel, Point(-1, -1), 2, BORDER_REPLICATE);
    
    	//显示二值化图片
    	imshow("segmentation", segmentation);
    
    	//找边界
    	vector< vector<Point> > contours;
    	vector<Vec4i> hierarchy;
    	findContours(segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));//CV_RETR_TREE
    	vector< vector<Point> > contours_poly(contours.size());
    
    	vector<Rect> boundRect;
    	boundRect.clear();
    
    	for (int index = 0; index < contours.size(); index++)
    	{
    		approxPolyDP(Mat(contours[index]), contours_poly[index], 3, true);
    		Rect rect = boundingRect(Mat(contours_poly[index]));
    		rectangle(image2, rect, Scalar(0, 255, 0), 2);
    	}
    	imshow("效果图", image2);
    }
    

    2.运行效果
    在这里插入图片描述

    结语

    1.例子很简单,但是这个方法用到移动目标追踪的上去,就是两帧差。
    2.关于工程的源码,运行程序时的bug,都可以加这个群(487350510)互相讨论学习。

    展开全文
  • 虽然单单要做车牌号识别的话不需要特别多种类的图像处理,但是我们不能只是为了这么一个目标去学习,所以这次就讲一些OpenCV里基本的图像处理,大家以后可以根据需求使用不同的图像处理。 一、图像显示 这一步在...
  • 来源:OpenCV-Python 中文教程   22 直方图 22.1 直方图的计算,绘制与分析 目标  • 使用 OpenCV 或 Numpy 函数计算直方图  • 使用 Opencv 或者 Matplotlib ...通过直方图你可以对整幅图像的灰度分布有一...
  • 三、图像增强 1、对比度展宽 图像对比度是指一幅图像中明暗区域间的亮度层级,对比度越大,图像从黑到白的层级越多,灰度表现力越强,可以看到更多图像灰度层级上的细节。对比度展宽是将图像的重要信息部分的对比...
  • 最近在学习OpenCV中算法的基础知识,发现很多细节,记录下来。 仿射变换和投影变换 仿射变化是图像在二维平面上进行变换,需要三个点的位置就能确定前后变换的模式,就像放在桌子上的一张纸,你只能转,裁剪,...
  • OpenCV图像处理知识

    2019-05-04 00:11:24
    OpenCV图像处理知识 OpenCV图像处理参考博客
  • OpenCV图像处理编程实例》-源码,最新更新20160801,支持OpenCV3.1+VS2015,修改若干程序中错误,如遇问题欢迎反馈到zhu1988wei@163.com
  • 目录 ...初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
  • 说明:1、 OpenCV图像处理编程实例所有代码已更新支持版本 OpenCV3.1.0+vs2015;2、修复了若干cpp中的错误及BUG;3、如若对代码存有疑问或发现其中的错误,敬请批评指正,谢谢,联系邮箱:zw301289@163.com;4、为...
  • 该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...
  • 本篇博客将介绍 读取、显示、保存图像,读取、修改 像素值(openCV 与 numpy) 三个部分。
  • Python+OpenCV3.3图像处理视频培训课程:该教程基于Python3.6+OpenCV新版本3.3.0详细讲述Python OpenCV图像处理部分内容,包括opencv人脸识别、人脸检测、数字验证码识别等内容。是Python开发者学习图像知识与应用...
  • 使用opencv 进行图像特效的处理,包括 灰度图像处理(基础),图像颜色反转,图像马赛克效果,图像毛玻璃效果,图像边缘检测,图像融合,浮雕效果,颜色映射效果,油画特效,使用opencv 3 python版本 3.6 ...
  • 本书以 OpenCV 开源库为基础实现图像处理领域的很多通用算法,并结合当今图像处理领域前沿技术, 对多个典型工程实例进行讲解及实现。全书内容覆盖面广,由基础到进阶,各个技术点均提供详细的代码
  • OpenCV库包括了对OpenCL和CUDA GPU架构的支持。 OpenCL(Open Computing Language):开放计算语言,可以附加在主机处理器的CPU或GPU上执行。 OpenCV有一个新的统一数据结构UMat,用于在必要和可能的时候,负责将...
  • javaCV图像处理系列: 一、javaCV图像处理之1:实时视频添加文字水印并截取视频...三、opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(方便多摄像头遍历及调用,相比javacv更快的摄像头读取速度和效...
1 2 3 4 5 ... 20
收藏数 72,740
精华内容 29,096