精华内容
下载资源
问答
  • 做视觉的朋友肯定会接触到各种相机(各种品牌),不管是工业相机、监控相机还是普通的USB Camera,都有一套常用的处理技巧,今天我们来看看IPCamera结合OpenCV图像处理的一般套路。IPCamera最常见的就是网络监控摄像头...

        做视觉的朋友肯定会接触到各种相机(各种品牌),不管是工业相机、监控相机还是普通的USB Camera,都有一套常用的处理技巧,今天我们来看看IPCamera结合OpenCV图像处理的一般套路。IPCamera最常见的就是网络监控摄像头,而国内海康威视已经占了大部分份额,而且现在的监控摄像头还添加了各种智能功能,更方便用户使用。今天就以海康的网络摄像头来说明(具体型号没查到,客户给的,做了一层铁壳封装)。

        第一步:购买摄像头。不管是自行购买还是客户指定,一定要确保支持二次开发,有途径能够获取相机的SDK,这样才能对相机进行下一步操作。

        第二步:使用SDK中的demo操作相机。这一步骤主要的目的是确保SDK没问题,免得后续浪费时间,当然如果是海康对应的IPCamera一般官网可以下载到SDK,应该没问题。相机与SDK验证分以下几个步骤:

        ① 保证接通电源,链接网络,设置IP和摄像头同一网段;

        一般IP地址为:192.168.1.64,我们将电脑IP地址设置成192.168.1.x,(x可以是除64以外的数字,比如2),然后打开浏览器,然后输入192.168.1.64

        ② 浏览器登录验证,输入账户密码,看是否能够预览相机画面;

        ③ 使用SDK中的demo打开相机。以C++为例,这一步一般注意编译环境问题,还有demo默认字符集是Unicode还是多字节,一般都是多字节字符集。运行时要将需要的HK dll 拷贝到exe同目录,如果还有其他问题需要看下SDK说明中的注意事项或操作手册。

        第三步:从简易demo中提取我们想要的功能并单独复现。个人建议自己新建一个MFC或Qt界面来复现demo中需要的功能,一是方便我们了解相机的一些操作函数使用,另一方面demo中一般多了一些我们不需要的功能且UI并不美观,当然,如果你很着急,可以直接在上面改。复现时的一般步骤:

        ① 注册相机。需要设置IP,端口,用户名,密码,注意变量的类型,然后找到注册函数,验证是否能成功注册,注册失败一般都会提示或者有对应的错误代码。这里在调用注册函数NET_DVR_Login_V30/V40之前,需要先调用NET_DVR_Init()函数来初始化SDK,否则其他函数都调用不了,这个需要看手册(手册中也有简单的示例代码和说明),最后和它配对使用的释放SDK资源的函数在销毁窗口时使用。

    NET_DVR_Cleanup(); //NET_DVR_Init和NET_DVR_Cleanup需要配对使用

        ② 打开相机,预览画面。MFC中一般使用Picture Control显示图像,如下面代码所示,使用NET_DVR_RealPlay_V30/V40函数,如果不设置回调函数,就直接给定Picture Control对应的窗口句柄,那么预览图像会显示在界面中 ,但是你无法操作图像。一般我们都需要指定回调函数,在回调函数中将图像数据解码后push到队列中,供图像处理时使用,此时hPlayWnd=NULL。

    NET_DVR_CLIENTINFO ClientInfo;
     //ClientInfo.hPlayWnd = GetDlgItem(IDC_PIC)->m_hWnd;
     ClientInfo.hPlayWnd = NULL;
     ClientInfo.lChannel = iChanIndex + 1;
     ClientInfo.lLinkMode = 0;
     ClientInfo.sMultiCastIP = NULL;
     TRACE("Channel number:%d\n", ClientInfo.lChannel);
     m_lPlayHandle = NET_DVR_RealPlay_V30(m_struDeviceInfo.lLoginID, &ClientInfo, fRealDataCallBack, NULL, TRUE);
     if (-1 == m_lPlayHandle)
     {
       DWORD err = NET_DVR_GetLastError();
       CString m_csErr;
       m_csErr.Format("播放出错,错误代码%d", err);
       MessageBox(m_csErr);
     }

    转到回调函数,可以设置是否边解码边显示预览,这里不预览(我们要显示处理后的预览图),这里的图像类型是T_YV12,使用一个解码回调函数来处理,vFrames队列中已是转换后的Mat类型图像。

    //设置解码回调函数 只解码不显示
    if (!PlayM4_SetDecCallBack(nPort, DecCBFun))
    {
      dRet = PlayM4_GetLastError(nPort);
      break;
    }
    void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)
    {
      long lFrameType = pFrameInfo->nType;
      
      if (lFrameType == T_YV12)
      {
        /*if (HK_Frame.empty())
        {
          HK_Frame.create(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);
        }*/
        Mat YUVImage(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (unsigned char*)pBuf);
        Mat img;
        cvtColor(YUVImage, img, COLOR_YUV2BGR_YV12);
        vFrames.push(img.clone());
      }
    }

        ③ 从Mat队列中取图像处理。这时候就可以使用线程或Timer在队列中逐个取图进行分析处理,每处理完一帧后pop释放当前帧;

    HK_Frame = vFrames.front();//其他处理操作vFrames.pop();

        第四步:关闭预览,释放SDK资源;关闭预览,注销,释放SDK.

    StopPlay();NET_DVR_Logout_V30(m_struDeviceInfo.lLoginID);NET_DVR_Cleanup(); //NET_DVR_Init和NET_DVR_Cleanup需要配对使用

        效果如下:

        完整代码将发布在知识星球中,更多学习资讯欢迎关注公众号:OpenCV与AI深度学习。

    展开全文
  • 篇的内容我们学习了Python使用OpenCV处理图像鼠标及键盘事件的基础方法使用Python OpenCV处理图像之详解使用OpenCV处理键盘鼠标事件及图像像素点内容的获取和设置使用Python OpenCV处理图像之使用OpenCV获取并...

    上几篇的内容我们学习了Python使用OpenCV处理图像鼠标及键盘事件的基础方法使用Python OpenCV处理图像之详解使用OpenCV处理键盘鼠标事件及图像像素点内容的获取和设置使用Python OpenCV处理图像之使用OpenCV获取并修改图像的像素值。

    今天,我们来了解下对于一幅图像中感兴趣的区域如何获取。

    e4dde71190ef76c6f53152cb87cf7effad516749.jpeg?token=f75b35ca3572a5dca8d769ab221fd71e&s=FB228644DEC84F6C093A3559030030BA如何获取我们感兴趣的内容呢

    首先,我们来打开一幅图像。具体代码如下,这里就不做解释了。

    import cv2

    img = cv2.imread('test.jpg')

    对于一幅图像来讲,我们知道图像的表示方式如下图所示。详细内容参见前篇博文。

    7acb0a46f21fbe09aa63131477b98f368644add4.jpeg?token=7f1ed90b51eaa6ac19e3f548b79b487a&s=A9831B7A13F6C46F0CAFA5ED0200703A图像像素点的表示方式

    当然,对于我们感兴趣的区域就是由一定范围内的许多个像素点来表示。那么,问题来了,如何获得这一区域内容?如何用更加便利的数据结构来表示这一块区域?我们来看一下OpenCV中如何获取这一块区域的内容。其实,原理很简单,就是利用数组切片和索引操作来选择指定区域的内容。我们来看打开的这幅图像的内容。

    b64543a98226cffc21cb92059fd8c995f403ea86.jpeg?token=a6263b009588196c24ed1d588e776d3f&s=6F5016C55860100BC1BE3D330300C01A原始图片

    如果我们对图片中的小船比较感兴趣,我们觉得这个小船有点孤单,想在小船的旁边在放一只同样大小的小船,我们该如何操作呢?

    首先,我们选取感兴趣区域的像素范围,如下图所示。

    4034970a304e251fe2b373c5bc5f4a127e3e53a1.jpeg?token=15f4467edda8c9836fa48b74c287a032&s=0F704A861E225009C48729B80300101E获取感兴趣区域像素范围

    然后我们把它裁剪出来,具体代码如下图所示。

    img2 = img[357:375, 415:447] # 从ps中获取的内容要横纵坐标转换一下,最终获取到区域像素范围。

    获取到这些内容了我们把它放到图片中的指定位置,注意,位置区域大小要和感兴趣的图片区域大小相同,具体打码如下所示。

    img[357:375, 445:477] = img2 #直接将img2区域的像素点内容赋值给img中的区域内即可

    我们来看下设置效果,如下图所示。

    0824ab18972bd407172fc74c60501d540db309f0.jpeg?token=1f25f4a9893ea9a8e6d2879880b71873&s=2B305687586A130BC9BE35330300901A实现了感兴趣区域的复制

    怎么样?是不是很酷,一只孤单的小船旁边又添加了一只。

    42a98226cffc1e17034e632251497506728de90b.jpeg?token=8db522bb03531d1cf00f024115240e15&s=15387B959CA9460D2236E5630300F033我们的小船不再孤单了

    好了,今天就到这里了,我们主要学习了感兴趣区域ROI的选取过程,并通过一个例子讲解了具体的操作步骤,感兴趣的朋友们自己马上试一试吧。从文中我们看到,对于感兴趣区域的选取,我们只能选择矩形区域内容。而且,当该区域粘贴到指定位置时,和背景图片融合不是很好。有没有好的办法呢?我们下文中会有涉及,欢迎大家留言讨论。

    转载请注明出处,百家号:Python高手养成。

    展开全文
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!

    前文参考:
    《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
    《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
    《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
    《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
    《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
    《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
    《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造

    上次博客介绍通过高通滤波和低通滤波对图像进行处理,包括轮廓提取和去噪,该系列教程其实是按照对图像的基本处理进行过程的讲解,包括读取图像、图像灰度处理、图像去噪、图像阈值化、图像形态学处理、然后才是图像轮廓提取,但由于高通滤波和低通滤波的原理是基于傅里叶变换的原理实现的,因此,放在一起进行讲解,同时也希望大家理解高通和低通滤波各自对应的作用,对于图像的轮廓提取的其他方法,在后面的博客也会讲到哦,大家记得收看!

    对于图像去噪处理就先告一段落,接下来,是对图像处理的下一个阶段讲解了–图像阈值化处理,在OpenCV中,图像阈值化是图像轮廓提取的一个重要步骤,而且不同场景需要不同的阈值化方法进行处理,本次博客,林君学长主要带大家理解OpenCV常用的几种图像阈值化处理原理和不同阈值化方法库函数的使用方法,同样的,我们需要通过原理自己编写对应的图像阈值化函数,完成图像阈值化功能!

    在介绍原理之前,首先我们应该清楚,图像阈值化处理一般是在图像去噪之后进行处理,阈值化处理的原因是因为图像轮廓提取对噪声比较敏感,因此,我们需要通过阈值化处理将噪声与需要的轮廓分开,达到我们需要的目的,图像处理的一般步骤如下所示,同时这也是学长对OpenCV图像处理教程讲解的步骤:

    1. 读取图像
    2. 图像灰度处理
    3. 图像去噪
    4. 图像阈值化
    5. 图像形态学处理
    6. 图像轮廓提取
    7. 目的操作

    而本次博客,主要讲解的是OpenCV图像处理第四步,前面过程请参考之前博客哦!

    图像二值化处理广泛应用于各行各业,比如生物学中的细胞图分割、交通领域的车牌设别等。在文化应用领域中,通过二值化处理将所需民族文物图像转换为黑白两色图,从而为后面的图像识别提供更好的支撑作用。下图表示图像经过各种二值化处理算法后的结果,其中“二进制阈值化”是最常见的黑白两色处理:
    在这里插入图片描述

    一、图像阈值化原理及功能函数编写

    1、图像阈值化简介

    图像阈值化又称为图像二值化,主要用来提取图像中的目标图像,例如图像的整体轮廓,通过人为设定一个值,将大于该值得的像素通过不同的原理设置为不同的值,小于该值的像素同样设定为不同的值,例如二进制阈值化,将大于阈值的像素设置为255白色,将小于阈值的像素设定为0黑色,将一张灰度图像变为只有两种颜色的过程,就称为阈值化过程,通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群。如下公式:
    { Y = 0 , gray[i,j]<T Y = 255 , gray[i,j]>=T 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} Y=0, & \text {gray[i,j]<T} \\ Y=255, & \text{gray[i,j]>=T} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {Y=0,Y=255,gray[i,j]<Tgray[i,j]>=Tgray[i,j](i,j)
    接下来,林君学长带大家了解不同阈值化处理的原理,并通过编写对于的阈值化函数吧!

    2、二进制阈值化

    1)、原理
    通过人为设定阈值,然后遍历整张图的像素点,将大于阈值的像素点设置为255白色,将小于阈值的像素点设置为0黑色,达到对灰度图二值化的目的,公式如下:
    { 如 果 g r a y [ i , j ] < T , gray[i,j]=0 如 果 g r a y [ i , j ] > = T , gray[i,j]=255 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} 如果gray[i,j]<T, & \text {gray[i,j]=0} \\ 如果gray[i,j]>=T, & \text{gray[i,j]=255} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {gray[i,j]<T,gray[i,j]>=T,gray[i,j]=0gray[i,j]=255gray[i,j](i,j)
    2)、构造二进制阈值化函数

    #导入库
    import cv2
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #定义二进制阈值化函数
    def thresh_binary(gray,threshold):#传递灰度图像和阈值
        h,w=gray.shape[0:2]#获取图像属性
        #设计一张空白图像,同于存放二进制阈值化后的图像,防止对原图像进行修改
        threshold1= np.zeros((h,w), dtype=gray.dtype)
        for i in range(h):
            for j in range(w):
                if gray[i,j]>=threshold:#判断大于阈值,设置为255
                    threshold1[i,j]=255
                else:
                    threshold1[i,j]=0
        return threshold1
    

    3)、读取图像添加噪声、灰度处理后调用二进制阈值化函数进行处理并显示

    #读取图像
    img=cv2.imread("my.jpg")
    h,w=img.shape[0:2]
    #加噪声
    for i in range(3000):    #添加3000个噪声点
        x = np.random.randint(0, h) 
        y = np.random.randint(0, w)    
        img[x,y,:] = 255
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #调用二进制阈值函数
    threshold=thresh_binary(gray,127)#传递灰度图像,并设置阈值为127
    #图像显示
    plt.subplot(121), plt.imshow(gray,'gray'), plt.title('原灰度图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(threshold,'gray'), plt.title('二进制阈值化')
    plt.axis('off')
    

    在这里插入图片描述

    可以看到,在进行二进制阈值化之后,灰度图像的椒盐噪声被我们很好的消除,设置椒盐噪声的时候,一般为255白色,因此,将阈值设置合理,低于噪声像素,我们就可以消除轮廓之外的噪声点,但不是消除噪声的主要方法哦,这只是为了降低后续图像轮廓提取步骤对噪声的敏感程度!接下来的步骤讲解,将不添加噪声了哦,大家明白原理就好,简化一下代码。

    3、反二进制阈值化

    1)、原理
    反二进制阈值化原理和二进制阈值化原理刚好相反,它的原理的将大于阈值的像素点的像素设置为0黑色,将小于阈值的像素点的像素设置为255黑色,原理公式如下所示:
    { 如 果 g r a y [ i , j ] < T , gray[i,j]=255 如 果 g r a y [ i , j ] > = T , gray[i,j]=0 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} 如果gray[i,j]<T, & \text {gray[i,j]=255} \\ 如果gray[i,j]>=T, & \text{gray[i,j]=0} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {gray[i,j]<T,gray[i,j]>=T,gray[i,j]=255gray[i,j]=0gray[i,j](i,j)
    2)、反二进制阈值化功能函数构造

    '''
    图像反二进制阈值化
    '''
    #导入库
    import cv2
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #定义反二进制阈值化函数
    def thresh_binary_inv(gray,threshold):#传递灰度图像和阈值
        h,w=gray.shape[0:2]#获取图像属性
        #设计一张空白图像,同于存放反二进制阈值化后的图像,防止对原图像进行修改
        threshold1= np.zeros((h,w), dtype=gray.dtype)
        for i in range(h):
            for j in range(w):
                if gray[i,j]>=threshold:#判断大于阈值,设置为0
                    threshold1[i,j]=0
                else:
                    threshold1[i,j]=255
        return threshold1
    

    3)、读取图像灰度化,然后调用反二进制阈值化函数处理,并观察图像

    #读取图像
    img=cv2.imread("my.jpg")
    h,w=img.shape[0:2]
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #调用反二进制阈值函数
    threshold=thresh_binary_inv(gray,127)#传递灰度图像,并设置阈值为127
    #图像显示
    plt.subplot(121), plt.imshow(gray,'gray'), plt.title('原灰度图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(threshold,'gray'), plt.title('反二进制阈值化')
    plt.axis('off')
    

    在这里插入图片描述
    由图像可观察出,反二进制阈值化处理后的图像与二进制阈值化处理后的图像颜色刚好相反,根据不同的图像可选择不同的阈值化处理哦!

    4、截断阈值化

    1)、原理
    截断阈值化原理是设定一个阈值,将像素点中像素值与阈值进行比较,当像素值大于阈值时,将该点像素值设置为阈值;当像素值小于阈值时,该像素点像素值不改变,原理公式如下所示:
    { 如 果 g r a y [ i , j ] < T , gray[i,j]=gray[i,j] 如 果 g r a y [ i , j ] > = T , gray[i,j]=T 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} 如果gray[i,j]<T, & \text {gray[i,j]=gray[i,j]} \\ 如果gray[i,j]>=T, & \text{gray[i,j]=T} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {gray[i,j]<T,gray[i,j]>=T,gray[i,j]=gray[i,j]gray[i,j]=Tgray[i,j](i,j)
    2)、截断阈值化功能函数构造

    '''
    图像截断阈值化
    '''
    #导入库
    import cv2
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #定义截断阈值化函数
    def thresh_trunc(gray,threshold):#传递灰度图像和阈值
        h,w=gray.shape[0:2]#获取图像属性
        #设计一张空白图像,同于存放截断阈值化后的图像,防止对原图像进行修改
        threshold1= np.zeros((h,w), dtype=gray.dtype)
        for i in range(h):
            for j in range(w):
                if gray[i,j]>=threshold:#判断大于阈值,设置为阈值
                    threshold1[i,j]=threshold
                else:
                    threshold1[i,j]=gray[i,j]
        return threshold1
    

    3)、读取图像灰度化,并调用截断阈值化函数,显示结果

    #读取图像
    img=cv2.imread("my.jpg")
    h,w=img.shape[0:2]
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #调用截断阈值函数
    threshold=thresh_trunc(gray,127)#传递灰度图像,并设置阈值为127
    #图像显示
    plt.subplot(121), plt.imshow(gray,'gray'), plt.title('原灰度图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(threshold,'gray'), plt.title('截断阈值化')
    plt.axis('off')
    

    在这里插入图片描述

    5、阈值化为0

    1)、原理
    设定阈值,遍历图像像素,如果像素点对应像素值大于阈值,该像素值保持不变;如果小于阈值,将该像素值设为0,原理公式如下所示:
    { 如 果 g r a y [ i , j ] < T , gray[i,j]=0 如 果 g r a y [ i , j ] > = T , gray[i,j]=gray[i,j] 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} 如果gray[i,j]<T, & \text {gray[i,j]=0} \\ 如果gray[i,j]>=T, & \text{gray[i,j]=gray[i,j]} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {gray[i,j]<T,gray[i,j]>=T,gray[i,j]=0gray[i,j]=gray[i,j]gray[i,j](i,j)
    2)、阈值化为0功能函数构造

    '''
    图像阈值化为0
    '''
    #导入库
    import cv2
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #定义阈值化为0函数
    def thresh_tozero(gray,threshold):#传递灰度图像和阈值
        h,w=gray.shape[0:2]#获取图像属性
        #设计一张空白图像,同于存放阈值化后为0的图像,防止对原图像进行修改
        threshold1= np.zeros((h,w), dtype=gray.dtype)
        for i in range(h):
            for j in range(w):
                if gray[i,j]>=threshold:#判断大于阈值,保持不变
                    threshold1[i,j]=gray[i,j]
                else:
                    threshold1[i,j]=0
        return threshold1
    

    3)、调用阈值化为0函数进行阈值化处理并显示

    #读取图像
    img=cv2.imread("my.jpg")
    h,w=img.shape[0:2]
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #调用阈值化为0函数
    threshold=thresh_tozero(gray,127)#传递灰度图像,并设置阈值为127
    #图像显示
    plt.subplot(121), plt.imshow(gray,'gray'), plt.title('原灰度图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(threshold,'gray'), plt.title('值化为0')
    plt.axis('off')
    

    在这里插入图片描述

    6、反阈值化为0

    1)、原理
    反阈值为0同样的,遍历图像,像素点像素值大于阈值,将像素值设置为0;小于阈值,则像素值保持不变,原理公式如下所示:
    { 如 果 g r a y [ i , j ] < g r a y [ i , j ] , gray[i,j]=0 如 果 g r a y [ i , j ] > = T , gray[i,j]=0 其 中 g r a y [ i , j ] 表 示 灰 度 图 像 在 点 ( i , j ) 对 于 的 像 素 值 \begin{cases} 如果gray[i,j]<gray[i,j], & \text {gray[i,j]=0} \\ 如果gray[i,j]>=T, & \text{gray[i,j]=0} \end{cases}\\\\ 其中gray[i,j]表示灰度图像在点(i,j)对于的像素值 {gray[i,j]<gray[i,j],gray[i,j]>=T,gray[i,j]=0gray[i,j]=0gray[i,j](i,j)
    2)、反阈值化为0功能函数构造

    '''
    反图像阈值化为0
    '''
    #导入库
    import cv2
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #定义阈值化为0函数
    def thresh_tozero_inv(gray,threshold):#传递灰度图像和阈值
        h,w=gray.shape[0:2]#获取图像属性
        #设计一张空白图像,同于存放反阈值化后为0的图像,防止对原图像进行修改
        threshold1= np.zeros((h,w), dtype=gray.dtype)
        for i in range(h):
            for j in range(w):
                if gray[i,j]>=threshold:#判断大于阈值,设置为0
                    threshold1[i,j]=0
                else: #判断小于阈值,保持不变
                    threshold1[i,j]=gray[i,j]
        return threshold1
    

    3)、调用反阈值化为0函数进行阈值化处理,并显示处理结果

    #读取图像
    img=cv2.imread("my.jpg")
    h,w=img.shape[0:2]
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    #调用反阈值化为0函数
    threshold=thresh_tozero_inv(gray,127)#传递灰度图像,并设置阈值为127
    #图像显示
    plt.subplot(121), plt.imshow(gray,'gray'), plt.title('原灰度图像')
    plt.axis('off')
    plt.subplot(122), plt.imshow(threshold,'gray'), plt.title('值化为0')
    plt.axis('off')
    

    在这里插入图片描述
    以上就是OpenCV中图像阈值化处理的方法原理,接下来,林君学长将介绍OpenCV中对图像阈值化处理的库函数的介绍及使用,一起来看吧!

    二、OpenCV图像阈值化库函数使用方法

    在OpenCV图像处理中,将上诉所写的5中方法集成到一个函数中进行使用,通过传递每种方法对应的参数进行不同阈值化方法的调用

    1、OpenCV库函数原型

    1)、函数原型:ret,threshold1=cv2.threshold(gray,threshold,MaxP,type)

    • threshold1:阈值化处理的结果图像
    • gray:需要阈值化处理的灰度图像
    • threshold:需要设定的阈值
    • MaxP:像素最大值(默认填写255)
    • type:参数类型,通过输入不同的参数确定不同的阈值化处理方法(掌握该函数使用的重点)

    其中type参数对应不同的阈值处理方法,具体参数对于方法如下所示:

    • cv2.THRESH_BINARY -------------对应二进制阈值化
    • cv2.THRESH_BINARY_INV ------对应反二进制阈值化
    • cv2.THRESH_TRUNC -------------对应截断阈值化
    • cv2.THRESH_TOZERO -----------对应阈值化为0
    • cv2.THRESH_TOZERO_INV ----对应反阈值化0

    接下来,通过OpneCV阈值化库函数进行不同阈值化的处理吧!

    2、OpenCV库函数使用

    #opencv阈值化库函数使用
    #导入函数库
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像
    img=cv2.imread('my.jpg')
    #图像灰度处理
    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
    #OpenCV阈值化库函数中不同阈值化方法处理
    ret,thresh1=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  #二进制阈值化
    ret,thresh2=cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)  #反二进制阈值化
    ret,thresh3=cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)  #截止阈值化
    ret,thresh4=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)  #阈值化为0
    ret,thresh5=cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV) #反阈值化为0
    #显示结果
    titles = ['灰度图像','二进制阈值化','反二进制阈值化','截止阈值化','阈值化为0','反阈值化为0']  
    images = [gray, thresh1, thresh2, thresh3, thresh4, thresh5]  
    for i in range(len(titles)):  
        plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')  #2行3列进行图像显示
        plt.title(titles[i])  #图像标题
        plt.axis('off')  #关闭坐标轴
    plt.show()
    

    在这里插入图片描述
    以上就是图像阈值化处理的不同处理方法及原理,希望通过理解原理了解如何对OpenCV图像库进行使用,并且,针对不同的图像选择不同的图像阈值化方法可以达到更好的效果哦,对于一张图像,根据他去噪后的灰度图选择不同的阈值化处理,可以在图像轮廓提取中得到更好的结果,这种更好的结果得益于我们选择阈值化处理的方法,从而降低轮廓提取算法对噪声的敏感程度!

    以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!

    一个人的记忆就是一座城市,时间腐蚀着一切建筑,把高楼和道路全部沙化。如果你不往前走,就会被沙子掩埋。所以我们泪流满面,步步回头,可是只能往前走 ——从你的全世界路过

    陈一月的又一天编程岁月^ _ ^

    展开全文
  • python 读取、保存、二值化、灰度化图片+opencv处理图片的方法笔者小白在神经网络训练好然后进行手写数字的图片预测的时候碰到了这样的问题。利用python如何读取、保存、二值化、灰度化图片呢?如何利用opencv处理...

    python 读取、保存、二值化、灰度化图片+opencv处理图片的方法

    笔者小白在神经网络训练好然后进行手写数字的图片预测的时候碰到了这样的问题。

    利用python如何读取、保存、二值化、灰度化图片呢?如何利用opencv来处理图片呢?

    先说说处理图片有三种方式

    一、matplotlib

    二、PIL

    三、opencv

    下面来依次描述。

    一、matplotlib

    # 1、显示图片

    import matplotlib.pyplot as plt #plt 用于显示图片

    import matplotlib.image as mpimg #mpimg 用于读取图片

    import numpy as np

    lena = mpimg.imread('lena.png') #读取和代码处于同一目录下的lena.png

    # 此时 lena 就已经是一个 np.array 了,可以对它进行任意处理

    lena.shape #(512, 512, 3)

    plt.imshow(lena) # 显示图片

    plt.axis('off') # 不显示坐标轴

    plt.show()

    # 2、显示图片的第一个通道

    lena_1 = lena[:,:,0]

    plt.imshow('lena_1')

    plt.show()

    # 此时会发现显示的是热量图,不是我们预想的灰度图,可以添加 cmap 参数,有如下几种添加方法:

    #方法一

    plt.imshow('lena_1', cmap='Greys_r')

    plt.show()

    #方法二

    img = plt.imshow('lena_1')

    img.set_cmap('gray') # 'hot' 是热量图

    plt.show()

    #3、将 RGB 转为灰度图

    def rgb2gray(rgb):

    return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])

    gray = rgb2gray(lena)

    # 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))

    plt.imshow(gray, cmap='Greys_r')

    plt.axis('off')

    plt.show()

    #4、对图像进行放缩

    from scipy import misc

    lena_new_sz = misc.imresize(lena, 0.5) # 第二个参数如果是整数,则为百分比,如果是tuple,则为输出图像的尺寸

    plt.imshow(lena_new_sz)

    plt.axis('off')

    plt.show()

    附上imresize的用法

    功能:改变图像的大小。

    用法:

    B = imresize(A,m)

    B = imresize(A,m,method)

    B = imresize(A,[mrows ncols],method)

    B = imresize(...,method,n)

    B = imresize(...,method,h)

    imrersize函数使用由参数method指定的插值运算来改变图像的大小。

    method的几种可选值:

    'nearest'(默认值)最近邻插值

    'bilinear'双线性插值

    'bicubic'双三次插值

    B = imresize(A,m)表示把图像A放大m倍

    B = imresize(...,method,h)中的h可以是任意一个FIR滤波器(h通常由函数ftrans2、fwind1、fwind2、或fsamp2等生成的二维FIR滤波器)。

    #5、保存 matplotlib 画出的图像

    plt.savefig('lena_new_sz.png')

    #5、将 array 保存为图像

    from scipy import misc

    misc.imsave('lena_new_sz.png', lena_new_sz)

    #5、直接保存 array

    #读取之后还是可以按照前面显示数组的方法对图像进行显示,这种方法完全不会对图像质量造成损失

    np.save('lena_new_sz', lena_new_sz) # 会在保存的名字后面自动加上.npy

    img = np.load('lena_new_sz.npy') # 读取前面保存的数组

    二、PIL

    #1、显示图片

    from PIL import Image

    im = Image.open('lena.png')

    im.show()

    #2、将 PIL Image 图片转换为 numpy 数组

    im_array = np.array(im)

    # 也可以用 np.asarray(im) 区别是 np.array() 是深拷贝,np.asarray() 是浅拷贝

    #3、保存 PIL 图片

    #直接调用 Image 类的 save 方法

    from PIL import Image

    I = Image.open('lena.png')

    I.save('new_lena.png')

    #4、将 numpy 数组转换为 PIL 图片

    #这里采用 matplotlib.image 读入图片数组,注意这里读入的数组是 float32 型的,范围是 0-1,而 PIL.Image 数据是 uinit8 型的,范围是0-255,所以要进行转换:

    import matplotlib.image as mpimg

    from PIL import Image

    lena = mpimg.imread('lena.png') # 这里读入的数据是 float32 型的,范围是0-1

    im = Image.fromarray(np.uinit8(lena*255))

    im.show()

    #5、RGB 转换为灰度图、二值化图

    from PIL import Image

    I = Image.open('lena.png')

    I.show()

    L = I.convert('L') #转化为灰度图

    L = I.convert('1') #转化为二值化图

    L.show()

    附:PIL可以对图像的颜色进行转换,并支持诸如24位彩色、8位灰度图和二值图等模式,简单的转换可以通过Image.convert(mode)函数完 成,其中mode表示输出的颜色模式,例如''L''表示灰度,''1''表示二值图模式等。但是利用convert函数将灰度图转换为二值图时,是采用 固定的阈 值127来实现的,即灰度高于127的像素值为1,而灰度低于127的像素值为0。

    三、opencv

    首先需要安装opencv,接下来演示在windows平台下python安装opencv,即实现import cv2功能。

    在官网:http://opencv.org/上找到OpenCV windows版下载下来。然后安装opencv,配置环境变量。这里就不多说了,请参考文献7。

    这里是python安装opencv的步骤:

    (1)在opencv的安装目录”

    \opencv\build\python\2.7\x64”或”\opencv\build\python\2.7\x86”(根据python版本)文件夹中找到cv2.pyd;

    (2)复制到Python安装目录的”\Python27\Lib\site-packages”文件夹中。

    然后在python的环境下测试import cv2 是否成功导入就好了。

    附上寻找python安装路径的方法:

    在python的环境下键入

    python -c “import os; print os.file”

    就可以看到根目录的位置,这里可以参考文献8。

    接下来开始描述如何利用opencv简单地处理图像

    #1、读取图像,并把图像转换为灰度图像并显示

    import cv2

    im = imread("./image.jpg") #读取图片

    im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) #转换了灰度化

    cv2.axis("off")

    cv2.title("Input Image")

    cv2.imshow(im_gray, cmap="gray") #显示图片

    cv2.show()

    #2、固定阈值二值化

    retval, im_at_fixed = cv2.threshold(im_gray, 50, 255, cv2.THRESH_BINARY)

    #将阈值设置为50,阈值类型为cv2.THRESH_BINARY,则灰度在大于50的像素其值将设置为255,其它像素设置为0

    cv2.axis("off")

    cv2.title("Fixed Thresholding")

    cv2.imshow(im_at_fixed, cmap = 'gray')

    cv2.show()

    #附:固定阈值二值化处理利用cv2.threshold函数,此函数的原型为:

    cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst

    其中:

    1、src 为输入图像;

    2、thresh 为阈值;

    3、maxval 为输出图像的最大值;

    4、type 为阈值的类型;

    5、dst 为目标图像。

    #附cv2.threshold函数的常用参数

    1、cv2.THRESH_BINARY(黑白二值)

    2、cv2.THRESH_BINARY_INV(黑白二值反转)

    3、cv2.THRESH_TRUNC (得到的图像为多像素值)

    4、cv2.THRESH_TOZERO

    5、cv2.THRESH_TOZERO_INV

    #3、算术平法的自适应二值化

    im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10)

    #上面我们将b设置为5,常数设置为10。

    cv2.axis("off")

    cv2.title("Adaptive Thresholding with mean weighted average")

    cv2.imshow(im_at_mean, cmap = 'gray')

    cv2.show()

    #附:算术平均法的自适应二值化利用cv2.adaptiveThreshold实现,此函数的原型为:

    cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

    其中:

    1、src 为输入图像;

    2、maxval 为输出图像的最大值;

    3、adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;

    4、thresholdType: 阈值的类型;

    5、blockSize: b的值;

    6、C 为从均值中减去的常数,用于得到阈值;

    7、dst 为目标图像。

    #4、高斯加权均值法自适应二值化

    im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 7)

    cv2.axis("off")

    cv2.title("Adaptive Thresholding with gaussian weighted average")

    cv2.imshow(im_at_mean, cmap = 'gray')

    cv2.show()

    #附:高斯加权均值法自适应二值化也是利用cv2.adaptiveThreshold, 此函数的原型与上述相同:

    cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

    其中:

    1、src 为输入图像;

    2、maxval 为输出图像的最大值;

    3、adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;

    4、thresholdType: 阈值的类型;

    5、blockSize: b的值;

    6、C 为从均值中减去的常数,用于得到阈值;

    7、dst 为目标图像。

    #5、保存图片

    #直接用cv2.imwrite

    import cv2

    cv2.imwrite("./new_img.jpg", img)

    cv2.imwrite("./new_img.jpg", img,[int(cv2.IMWRITE_JPEG_QUALITY), 5])

    #第一个参数是保存的路径及文件名,第二个是图像矩阵。

    #第三个参数针对特定的格式:

    #对于JPEG,其表示的是图像的质量,用0-100的整数表示,默认为95。

    #对于PNG,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从0到9,压缩级别越高,图像尺寸越小。默认级别为3

    #注意cv2.IMWRITE_JPEG_QUALITY类型为Long,必须转换成int。

    #6、创建于复制图片

    #如果要创建图像,需要使用numpy的函数

    #创建空的图片

    emptyImage = np.zeros(img.shape, np.uint8)

    #复制原有的图片

    emptyImage2 = img.copy();

    #用cvtColor获得原图像的副本

    emptyImage3=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    #emptyImage3[...]=0

    #后面的emptyImage3[...]=0是将其转成空白的黑色图像。

    参考文献:

    1、http://www.cnblogs.com/yinxiangnan-charles/p/5928689.html 2017.4.6

    2、http://blog.csdn.net/colddie/article/details/7683492 2017.4.6

    3、http://baike.baidu.com/link?url=OwMX6Isz30GnW7c7oouG3y48eYg6vhHMeHoiK9f38ZVNGeW8EOaH3fY-4k2k96dZZK8BZKd_O-Esl2tUgPFmPWonrv7WQjEDPcpCv_TPSJO 2017.4.6

    4、http://blog.csdn.net/vange/article/details/5395771 2017.4.6

    5、http://www.jb51.net/article/62315.htm 2017.4.6

    6、http://blog.csdn.net/lyj_viviani/article/details/59482602 2017.4.6

    7、http://blog.csdn.net/poem_qianmo/article/details/19809337/ 2017.4.6

    8、http://www.jb51.net/article/65036.htm 2017.4.6

    9、http://blog.csdn.net/deerlux/article/details/48477219 2017.4.6

    10、http://www.mamicode.com/info-detail-907204.html 2017.4.6

    11、http://blog.csdn.net/sunny2038/article/details/9057415 2017.4.6

    喜欢 (1)or分享 (0)

    展开全文
  • 本章内容都是和图像处理相关的,学习颜色空间的变换,几何变换,图像平滑,形态学变换,边缘检测,轮廓检测等知识。 正文 1、 颜色空间转换 OpenCV中有数百种关于不同颜色空间之间的转换的方法。当前计算机视觉...
  • opencv图像处理总结

    千次阅读 2016-03-17 14:26:29
    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_(S|U|F)C 其中,S表示带符号整数; U表示无符号整数; F表示浮点数; 例如:CV_8UC1 表示8位无符号单通道矩阵;  CV_32FC2 表示32位...
  • 笔者小白在神经网络训练好然后进行手写数字的图片预测的时候碰到了这样的问题。利用python如何读取、保存、二值化、灰度化图片呢?如何利用opencv处理图片呢?
  • OpenCV图像处理

    千次阅读 2015-11-05 11:42:32
    http://hahack.com/wiki/opencv-image.html
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 其实很久之前就有做过图像处理的项目,是做关于无人机的目标跟踪的项目,不过那会也是刚接触图像处理,写起代码就是网上翻篇目标识别的论文,照着别人网上发的论文给出的目标识别的步骤框架,去找opencv对应的封装...
  • OpenCV进行图像相似度对比的种办法

    万次阅读 多人点赞 2015-02-16 18:40:03
    来自:shiter编写程序的艺术 ...对计算图像相似度的方法,本文做了如下总结,主要有三种办法:1.PSNR峰值信噪比PSNR(Peak Signal to Noise Ratio),一种全参考的图像质量评价指标。简介:https://en.wikipedia.
  • 使用opencv-python编辑图片步骤(一)

    千次阅读 2019-05-23 00:06:20
    因为最近在使用YOLO模型,需要对采集到的高分辨率图片数据进行一系列的处理以适应模型的输入,所以需要对采集到的图片进行预处理,这过程需要用到opencv-pyhon,所以打算整理一下简单的使用过程。参考了以下博客,...
  • 本节为opencv数字图像处理(3):灰度变换与空间滤波的第三小节,图像平滑与锐化,主要包括:平滑线性滤波器(均值、盒装etc)、统计排序滤波器(中值etc)、拉普拉斯算子、梯度算子、边缘检测算子的对比及其C++实现...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 1 py+opencv图像处理

    2018-08-17 13:56:31
    窝想制作一个lovelive打歌机,硬件资讯了学弟准备康康arduino(是这么拼吧)加步进电机或者小马达橡皮筋,软件来个图像识别,比之前网上看到的强码图谱高几个华莱士   首先研究图像识别。音游按键与背景色对比度...
  • OpenCV 图像处理编程学习笔记

    千次阅读 2018-07-28 11:09:47
    OpenCV编程实例代码》各章重点知识点简述 第一章 OpenCv环境配置 主要讲解了 OpenCV 的各种开发环境的配置,其中以Sublime 作为主要的配置环境的介绍,这里我们主要使用 VScode 进行开发。 第二章 ...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • OpenCV训练人脸分类器步骤解析

    千次阅读 2017-03-20 19:55:11
    从网上下载人脸图片正样本,背景负样本各1000张,正样本放在D:\classify\posdata文件夹下,负样本放在D:\classify\negdata文件夹下,正负样本要裁剪一样大小,在此作者采用样20*20大小样本,准备工作做完。...
  • 图像处理opencv图像特效大全

    千次阅读 2020-01-30 22:06:44
    1、特效1:灰度处理 1.1、cv2.imread()方法 1.2、cv2.cvtColor()方法 1.3、GRB均值法 1.4、心理学汇总计算法 1.5、优化灰度算法 2、特效2:地板效果 2.1、灰色图片颜色反转 2.2、彩色图片颜色反转 3、特效3:马赛克 ...
  • 本节基于OpenCV官方文档基础之上,介绍了击中击不中HITMISS变换处理的原理、算法、图解案例以及案例实现,击中击不中HITMISS变换处理是通过两次腐蚀查找图像内部特定的形状。
  • 用到的工具:opencv_createsamples.exe、opencv_traincascade.exe(有些版本是opencv_haartraining.exe),这两工具在opencv的安装路径下。 整个过程分成三阶段:样本采集、分类器训练和运用训练好的分类器进行...
  • python 读取、保存、二值化、灰度化图片+opencv处理图片的方法 进行手写数字的图片预测的时候碰到了这样的问题。 先说说处理图片有三种方式 一、matplotlib 二、PIL 三、opencv 一、matplotlib 1、显示图片 import ...
  • OpenCV图像平滑处理

    千次阅读 2014-05-07 00:21:27
    1.平滑处理 也称模糊处理,常用来减少图像噪声或者失真,降低图像分辨率
  • 直方图在 Python OpenCV 中的妙用
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • OpenCV是一用于图像处理、分析、机器视觉方面的开源函数库.无论你是做科学研究,还是商业应用,opencv都可以作为你理想的工具库,因为,对于这两者,它完全是免费的 二、使用步骤 1.图像读取: 1.img=c...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,363
精华内容 4,945
关键字:

opencv处理图像的几个步骤