精华内容
下载资源
问答
  • python+opencv实现图像复制和旋转 一开始,我们要先下载安装好opencv的类库。我们只要按住键盘上[Window]+[R],打开cmd,并在cmd中输入一下代码: pip3 install opencv实现图片复制操作之前,我们要先来理解,...

    python+opencv实现图像的复制和旋转

    一开始,我们要先下载安装好opencv的类库。我们只要按住键盘上[Window]+[R],打开cmd,并在cmd中输入一下代码:

    pip3 install opencv
    

    在实现图片复制操作之前,我们要先来理解,jpg样式的图片都可以用三维矩阵表示出来,即图片的宽、高和颜色(0~255,3个通道)组成。

    接下来我们就来看一下图片的复制操作,直接上代码:

    import numpy as np
    import cv2
    
    img = cv2.imread("2.jpg")   #导入图片
    rows, cols = img.shape[:2]  #获得图片的高和宽
    mapx = np.zeros(img.shape[:2],np.float32)   #mapx是一个图片大小的变换矩阵
    mapy = np.zeros(img.shape[:2],np.float32)   #mapy也是一个图片大小的变换矩阵
    for i in range(rows):       #遍历,将获得到图片的宽和稿依次赋予两个变换矩阵
        for j in range(cols):
            mapx.itemset((i,j),j)
            mapy.itemset((i,j),i)
    rst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)   #用仿射函数实现仿射变换
    cv2.imshow("oriange:",img)
    cv2.imshow("result:",rst)
    cv2.waitKey()
    
    

    通过变换矩阵,可以将原始图像O转化为仿射图像R,而这里的两个映射参数mapx和mapy即为两个变换矩阵。mapx为对应位置上的x轴坐标值,mapy为对应位置上的y轴坐标值。

    通过上述处理,可以让函数cv2.remap()完成数组复制。

    下面展示图片绕x轴翻转:

    import numpy as np
    import cv2
    
    img = cv2.imread("2.jpg")
    rows, cols = img.shape[:2]
    mapx = np.zeros(img.shape[:2],np.float32)
    mapy = np.zeros(img.shape[:2],np.float32)
    for i in range(rows):
        for j in range(cols):
            mapx.itemset((i,j),cols-1-j)
            mapy.itemset((i,j),i)
    rst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
    cv2.imshow("original",img)
    cv2.imshow("result",rst)
    cv2.waitKey(0)
    

    原理和图片的复制一样,不过在给mapx赋值时,我们让mapx从后往前复制,这样就让x轴产生了翻转。同理,y轴的翻转、x轴y轴同时翻转原理也相同,这里就不多赘述。

    展开全文
  • 本专栏主要介绍如果通过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视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
    《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
    《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
    《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
    《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
    《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
    《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法

    上次博客,我们结束了基本图像处理的全部过程,本来本次博客是通过OpenCV进行项目实战的,但自己发现前面忘记讲解了OpenCV实现图像缩放和旋转的原理,于是本次博客作为一个补充讲解,因为图像的旋转和缩放在进行图像增强或者对于图像美化来说是一个重点,掌握原理才能更好的实现对图像的处理,因此在该系列的第15节作为一个补充讲解,一起学习吧!

    一、图像缩放

    1、图像缩放原理

    1)、图像缩放简介
    在计算机图像处理和计算机图形学中,图像缩放(image scaling)是指对数字图像的大小进行调整的过程。图像缩放是一种非平凡的过程,需要在处理效率以及结果的平滑度(smoothness)和清晰度(sharpness)上做一个权衡。当一个图像的大小增加之后,组成图像的像素的可见度将会变得更高,从而使得图像表现得“软”。相反地,缩小一个图像将会增强它的平滑度和清晰度。

    图像缩放有很多种算法,最简单的方法为邻域插值,即将每一个原像素原封不动地复制映射到扩展后对应四个像素中,这种方法在放大图像的同时保留了所有的原图像的所有信息,但是会产生锯齿现象。
    双线性插值的效果对于放大的图像而言较领域插值来得平滑,但是却使得图像变得模糊而且仍然会有一部分锯齿现象。双三次插值更好比双线性插值更好。
    2)、图像缩放原理
    本次博客,只讲解图像缩放的基本原理,邻域插值,如下:

    • 假设我们有一张原始图(源图,source),大小为3*3:
      在这里插入图片描述
    • 想要放大为4*4的目标图(destination):
      在这里插入图片描述
    • 那么邻域插值公式原理便如下所示:
      在这里插入图片描述
      因此,以上公式便作为我们图像缩放函数构造的基本原理,现在就进行图像缩放函数的构造吧!

    2、图像缩放函数构造

    1)、图像缩放功能函数构造

    '''
        图像处理之图像缩放
    '''
    #图像缩放函数构造
    def zoom(img,factor): #img为需要进行缩放的图像,factor为图像缩小因子(0-1)或者图像尺寸(多少x多少),输入为数组,数组长度为1表示为缩放因子,长度为2表示为缩放尺寸
        #读取图片的高和宽和通道数
        h,w,c=img.shape 
        if len(factor)==1:
            #定义缩放图片的尺寸,0.5位缩放因子,缩放为原来的0.5倍
            h1,w1=int(h*factor[0]),int(w*factor[0])
        elif len(factor)==2:
            h1,w1=factor
        else:
            print("输入错误,请输入数组,长度为1或者为2!")
        #定义空白图像,用于存放缩放后的图片像素
        img1=np.zeros((h1,w1,c),np.uint8) 
        #遍历图像缩放像素
        for i in range(h1): 
            for j in range(w1):
                i1=int(i*(h*1.0/h1))
                j1=int(j*(w*1.0/h1))
                img1[i,j]=img[i1,j1]
        return img1
    

    2)、读取图像,进行图像缩放

    import cv2
    import numpy as np
    #np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
    #读取图像
    img=cv2.imread("my.jpg")
    #调用图像缩小函数进行图像缩小
    zoom=zoom(img,[250,250])#将图像缩放为250x250尺寸的
    #图像显示
    cv2.imshow("src",img)
    cv2.imshow("zoom",zoom)
    cv2.waitKey(0)
    

    (1)、首先,我们将图像设置为250x250的尺寸进行缩小:zoom=zoom(img,[250,250])
    在这里插入图片描述
    (2)、通过缩放因子进行缩小,缩小为原图的0.5倍大小:zoom=zoom(img,[0.5])
    在这里插入图片描述
    (3)、设置图像尺寸为(400x400),将图像进行放大:zoom=zoom(img,[400,400])
    在这里插入图片描述
    (4)、设置图像缩放因子为1.2,将图像放大为原图的1.2倍:zoom=zoom(img,[1.2])
    在这里插入图片描述
    通过以上原理,我们自行构造图像缩放功能函数,在进行图像缩放的同时,应该注意,图像的放大和缩小是不可逆的,不对称的,放大后的图像再进行缩小不是原图哦,图像放大是通过插值像素完成的,和原始像素是有区别的,如果放得太大,图像就会模糊,这样的图像再经过以上的缩小是回不去的,如下:
    在这里插入图片描述
    由上面可以看出,图像放大后会过于模糊而导致不清晰!

    3、图像缩放OpenCV库函数使用方法

    在OpenCV中,图像缩放通过resize()函数实现,如下介绍
    1)、缩放函数函数原型:
    result = cv2.resize(src, (sizeX,sizeY))
    result = cv2.resize(src, fx, fy)

    • src:需要缩放的图像
    • (sizeX,sizeY):目标图像的尺寸:通过直接设置尺寸实现
    • fx, fy:目标图像的尺寸:通过缩放因子实现,在原图的基础上缩小或者放大

    2)、图像缩放库函数使用

    '''
        图像处理之图像缩放OpenCV库函数使用
    '''
    #读取图像
    img=cv2.imread("my.jpg")
    #调用图像缩小函数进行图像缩小
    zoom=cv2.resize(img, (250,250))#将图像缩放为250x250尺寸的
    #或者通过缩放因子实现,如下:
    #zoom=cv2.resize(img,fx=0.5, fy=0.5)
    #图像显示
    cv2.imshow("src",img)
    cv2.imshow("zoom",zoom)
    cv2.waitKey(0)
    

    在这里插入图片描述


    二、图像旋转

    图像旋转主要确定旋转中心和旋转角度,然后对图像的像素进行交换就好,具体原理如下

    1、图像旋转原理

    1)、图像旋转简介
    图像旋转是指图像以某一点为中心旋转一定的角度,形成一幅新的图像的过程。当然这个点通常就是图像的中心。既然是按照中心旋转,自然会有这样一个属性:旋转前和旋转后的点离中心的位置不变。
    2)、图像旋转原理
    设(x0, y0)是旋转后的坐标,(x, y)是旋转前的坐标,(m,n)是旋转中心,a是旋转的角度,(left,top)是旋转后图像的左上角坐标,则公式如下:
    [ x 0 y 0 1 ] = [ x y 1 ] [ 1 0 0 0 − 1 0 − m n 1 ] [ cos ⁡ ( a ) − sin ⁡ ( a ) 0 s i n ( a ) cos ⁡ ( a ) 0 0 0 1 ] [ 1 0 0 0 − 1 0 m n 1 ] \begin{bmatrix} x_0 & y_0&1 \end{bmatrix}=\begin{bmatrix} x & y&1 \end{bmatrix}\begin{bmatrix} 1 & 0&0\\0&-1&0\\-m&n&1\end{bmatrix}\begin{bmatrix} \cos(a) & -\sin(a)&0\\sin(a) & \cos(a)&0\\0 & 0&1\end{bmatrix}\begin{bmatrix} 1 & 0&0\\0&-1&0\\m&n&1\end{bmatrix} [x0y01]=[xy1]10m01n001cos(a)sin(a)0sin(a)cos(a)000110m01n001
    以上原理可以理解为,先将图像平移到旋转点,然后进行旋转,最后将图像平移回去;因此,通过以上公式,我们便可以自行设计出图像旋转函数,进行图像旋转

    2、图像旋转函数构造

    1)、图像旋转功能函数构造

    '''
        图像处理之图像旋转功能函数构造
    '''
    def rotate(img,a):
        #读取图片的高和宽和通道数
        h,w,c=img.shape 
        #计算对角线长度作为新图像的长和高,因为旋转会有一部分图像在原图像外部
        a1=np.pi*a/180
        r=np.sqrt(h**2+w**2)/2
        #定义空白图像,用于存放旋转后的图片像素
        img1=np.zeros((h,w,c),np.uint8) 
        #确定旋转中心
        x=int(h/2)
        y=int(w/2)
        #遍历图像缩放像素
        for i in range(h): 
            for j in range(w):
                a=np.array([i,j,1])#公式中的第一个矩阵
                b=np.array([[1,0,0],[0,-1,0],[-x,y,1]])#公式中的第二个矩阵
                c=np.array([[np.cos(a1),-np.sin(a1),0],[np.sin(a1),np.cos(a1),0],[0,0,1]])#公式中第三个矩阵
                d=np.array([[1,0,0],[0,-1,0],[x,y,1]])#公式中第四个矩阵
                M=np.dot((np.dot((np.dot(a,b)),c)),d)
                if -1<int(M[0])<h and -1<int(M[1])<w:
                    img1[i,j]=img[int(M[0]),int(M[1])]
        return img1  
    

    2)、读取图像,实现图像旋转功能

    import cv2
    import numpy as np
    #np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像
    img=cv2.imread("my.jpg")
    #对原图进行格式转换,方便matplotlib图像显示
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #调用图像旋转函数,进行30、45、60、90度旋转
    rotate1=rotate(img,30)
    rotate2=rotate(img,45)
    rotate3=rotate(img,60)
    rotate4=rotate(img,90)
    #图像显示
    titles = [ '30度旋转', '45度旋转', '60度旋转', '90度旋转']  
    images = [rotate1, rotate2, rotate3, rotate4]  
    for i in range(4):
        plt.subplot(2,2,i+1), plt.imshow(images[i],)  
        plt.title(titles[i])  
        plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()  
    

    在这里插入图片描述
    注意:以上通过原理编写的函数实现顺时针旋转!

    3、图像旋转OpenCV库函数使用方法

    OpenCV官方给出的库函数中,图像旋转主要调用getRotationMatrix2D()函数和warpAffine()函数实现,绕图像的中心旋转,如下介绍
    1)、getRotationMatrix2D()函数原型:M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)

    • (cols/2, rows/2):旋转中心
    • 30:选择角度
    • 1:旋转缩放比例,1为原始比例

    2)、warpAffine()函数原型:rotated = cv2.warpAffine(src, M, (cols, rows))

    • src:需要进行旋转的图像
    • M:旋转参数,通过getRotationMatrix2D()函数得出
    • (cols, rows):原始图像宽高

    3)、OpenCV图像旋转库函数使用

    '''
        图像处理之图像旋转OpenCV库函数使用
    '''
    import cv2  
    import numpy as np  
    #读取图片
    src = cv2.imread('my.jpg')
    #原图的高、宽 以及通道数
    rows, cols, channel = src.shape
    #绕图像的中心旋转
    #参数:旋转中心 旋转度数 scale
    M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1) #绕中心旋转90度原图
    #参数:原始图像 旋转参数 元素图像宽高
    rotated = cv2.warpAffine(src, M, (cols, rows))
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("rotated", rotated)
    #等待显示
    cv2.waitKey(0)
    

    在这里插入图片描述

    • 缩小为原来的0.8倍再进行90度旋转:M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 0.8)
      在这里插入图片描述

    • 放大为原来的1.2倍再进行90度旋转:M = cv2.getRotationMatrix2D((cols/2, rows/2), 90, 1.2)
      在这里插入图片描述


    三、图像平移

    对于图像平移比较简单,就是单纯的将像素上下左右赋值就好,具体如下介绍

    1、图像平移原理

    图像平移:设(x0, y0)是缩放后的坐标,(x, y)是缩放前的坐标,dx、dy为偏移量,则公式如下:
    在这里插入图片描述
    后面包含dx和dy的矩阵为平移矩阵

    2、图像平移函数构造

    1)、图像平移函数功能构造

    '''
        图像处理之图像平移
    '''
    #图像缩放函数构造
    def translation(img,factor): #factor为偏移量,即为平移量输入格式为[20,20],理解为向下向右平移20个像素
        #读取图片的高和宽和通道数
        h,w,c=img.shape 
        #定义空白图像,用于存放平移后的图片像素
        img1=np.zeros((h,w,c),np.uint8) 
        dx,dy=factor
        #遍历图像缩放像素
        for i in range(h-dx): 
            for j in range(w-dy):
                a=np.array([i,j,1])
                b=np.array([[1,0,0],[0,1,0],[abs(dx),abs(dy),1]])
                M=np.dot(a,b)
                #print(M)
                if dx>=0 and dy>=0:
                    img1[M[0],M[1]]=img[i,j]  
                if dx<=0 and dy<=0:
                    if M[0]<h and M[1]<w:
                        img1[i,j]=img[M[0],M[1]]
        return img1
    

    2)、读取图像,进行图像平移

    import cv2
    import numpy as np
    #np.set_printoptions(threshold=np.inf)  #打印数组中的全部内容
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
    #读取图像
    img=cv2.imread("my.jpg")
    #对原图进行格式转换,方便matplotlib图像显示
    img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #调用图像平移函数进行图像上下左右平移
    translation1=translation(img,[-100,0])
    translation2=translation(img,[100,0])
    translation3=translation(img,[0,-100])
    translation4=translation(img,[0,100])
    #图像显示
    titles = [ '向上平移', '向下平移', '向左平移', '向右平移']  
    images = [translation1, translation2, translation3, translation4]  
    for i in range(4):
        plt.subplot(2,2,i+1), plt.imshow(images[i])  
        plt.title(titles[i])  
        plt.axis('off')#关闭坐标轴  设置为on则表示开启坐标轴
    plt.show()  
    

    在这里插入图片描述

    3、图像平移OpenCV库函数使用方法

    图像平移首先定义平移矩阵M,再调用warpAffine()函数实现平移,如下技术
    1)、图像平移OpenCV库函数原理
    M = np.float32([[1, 0, x], [0, 1, y]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    2)、图像平移OpenCV库函数使用

    '''
        图像处理之图像平移OpenCV库函数使用
    '''
    import cv2  
    import numpy as np
    import matplotlib.pyplot as plt
     
    #读取图片
    img = cv2.imread('my.jpg')
    #对原图进行格式转换,方便matplotlib图像显示
    image = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    #图像平移 下、上、右、左平移
    M = np.float32([[1, 0, 0], [0, 1, 100]])
    img1 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, 0], [0, 1, -100]])
    img2 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, 100], [0, 1, 0]])
    img3 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    M = np.float32([[1, 0, -100], [0, 1, 0]])
    img4 = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
    
    #显示图形
    titles = [ 'Image1', 'Image2', 'Image3', 'Image4']  
    images = [img1, img2, img3, img4]  
    for i in range(4):  
       plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()  
    

    在这里插入图片描述

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

    同样是一颗心,有的能装下高山,有的能装下大海,有的却只能装下一己之悲欢。有大心量者,方能有大格局,有大格局者,方能成大气候。心有多大,世界就有多大,梦有多远,脚步就有多远。

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

    展开全文
  • 本专栏主要介绍如果通过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视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
    《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
    《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
    《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
    《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
    《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
    《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
    《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
    《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测
    《OpenCv视觉之眼》Python图像处理十七:Opencv图像处理实战二之图像中的物体识别并截取
    《OpenCv视觉之眼》Python图像处理十八:Opencv图像处理实战三之基于OpenCV训练模型的AI人脸检测
    《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之通过OpenCV进行人脸口罩模型训练并进行口罩检测
    《OpenCv视觉之眼》Python图像处理二十:Opencv图像美化处理之图像流年、光照、浮雕、素描、怀旧、滤镜、毛玻璃、油漆特效处理
    《OpenCv视觉之眼》Python图像处理二十一:Opencv图像处理之图像线性变换和非线性变换的方法及原理
    《OpenCv视觉之眼》Python图像处理二十二:Opencv图像处理实战五之图像中直线和圆的检测原理及实现

    对于《OpenCV视觉之眼》专栏,前前后后将了二十二章的相关知识;讲到这里,对于OpenCV的相关知识差不多就结束了,本次博客,是对前面学习的知识做的一个总结和合集,相当于期末的大作业形式,综合前面所学习,所讲到的知识,另外结合一点pyqt5界面设计的新的知识,对OpenCV图像处理做一个全面概括和总结,实现对图像的一系列操作。

    因此,Python图像处理二十三章将作为《OpenCV视觉之眼》专栏系列的最终章,如果前面对相关知识不熟悉的建议找到对应的章节进行原理和方法的学习,如果已经熟悉,那么可以直接阅读最终项目合集,一起来看吧!

    一、OpenCV图像处理最终章环境搭建

    对于OpenCV图像处理的集成,在JupyterNotebook上面已经不再适合操作,因为我们需要在完成功能的基础上融合界面的设计;因此,最终的项目林君学长选择在Pycharm上面完成,实现界面与功能的完美实现及融合;选择Pycharm也是有原因的,因为它可以为该项目创建一个单独的python环境,需要什么库就为该项目创建什么库,不会有冗余;同时也方便界面设计操作。

    注意:下面的操作,林君学长假设大家在windows上已经安装好Python环境,如果Python环境没有安装的,建议回到上面前文参考一览,点击Python图像处理一,进行Python环境的搭建!

    1、Pycharm下载及安装

    提示:如果pycharm已经下载并且安装好,并且懂得环境配置,那么请通过目录直接跳过1和2两部,直接到第三步骤,查看本项目需要下载的库

    1)、通过下面Pychram的官网下载地址,下载你觉得舒服的版本的Pycharm,对于开发人员来讲,如果经济实力允许,请下载专业版然后购买;如果经济实力有困难,建议选择社区版本,免费开源的
    Pychram官网下载地址
    在这里插入图片描述
    2)、双击打开 pycharm 安装包出现如下界面,点击 Next
    在这里插入图片描述
    3)、先选择安装路径(注意不要出现中文路径,且要记住路径),然后点击 Next 继续
    在这里插入图片描述
    4)、勾选 64-bit launcher,点击 Next 下一步
    在这里插入图片描述
    5)、点击 Install 进行安装
    在这里插入图片描述
    6)、安装过程如图所示
    在这里插入图片描述
    7)、完成安装如图,点击Finish 结束
    在这里插入图片描述

    2、Pycharm环境配置

    1)、1.双击桌面 pycharm 图标,打开软件,如图所示,进行勾选 I confirm ,然后点击 Continue
    下一步
    在这里插入图片描述
    2)、点击 Don’t Send
    在这里插入图片描述
    3)、进行默认设置即可,点击 Skip
    在这里插入图片描述
    4)、点击软件右下角的 Configure,选中第一个 Settings 进行点击
    在这里插入图片描述
    5)、出现如下图界面,在左边找到 Project Interpreter 点击
    在这里插入图片描述
    6)、点击右侧齿轮,如下图所示,然后在弹出的选择菜单中选择 Add 进行点击
    在这里插入图片描述
    在这里插入图片描述

    7)、在窗口中选择 Virtualenv Environment,点击 New environment,然后在 location 栏中删
    除之前的内容,复制路径(D:\Program Files\Python\venv_py37_qt5_cv4_tf2)粘贴进
    location 栏中,如图所示,最后点击 OK
    在这里插入图片描述
    上面3所选择的路径位置为为项目存放的独立python环境的位置
    8)、等待加载完成,点击右侧的+号按钮
    在这里插入图片描述
    9)、点击下方的 Manage Repositories
    在这里插入图片描述
    10)、修改源地址,点击窗口右边的编辑 Eidt 按钮,在弹出的窗体中修改为新的源
    地址(https://pypi.tuna.tsinghua.edu.cn/simple),如图所示。点击 OK 按钮,回到上层
    再点击 OK 按钮
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    建议添加清华源和豆瓣源两个源,豆瓣源:https://pypi.doubanio.com/simple/
    11)、点击如图所示的更新按钮进行更新,完成后会在每个包名后出现一个地址
    在这里插入图片描述
    到这里,环境配置完成!

    3、本项目需要下载的库

    1)、下载pyqt5界面设计库及其工具库,在搜索栏中输入 pyqt5-tools,在列表框中选择同名对应的一项,选中后在左下角点击 Install Package
    在这里插入图片描述
    安装过程如下图所示,注意:有些时候可能没有中间的窗口,通过查看如图框出的标识
    的转动的圆圈也说明正在下载安装。
    在这里插入图片描述
    安装成功如下图所示,如果没有出现下图的 Package xxx installed successfully,说明安
    装出错,重复执行 13 步骤进行安装(多次重复后如果不行,过段时间再试)
    在这里插入图片描述
    2)、其他下载库的方法和上面方法一样,这里给出本项目需要库一览表

    • opencv-python
    • PyQt5
    • pyqt5-tools
    • pyuic5-tool
    • matplotlib
    • math
    • numpy

    二、OpenCV图像处理界面设计

    该项目的界面设计主要通过PyQt5来实现,通过qt的界面设计,最后通过功能库转为py文件,就可以使用了,转换库为上面我们下载的pyuic5,转换方法为终端输入:pyuic5 xx.ui -o xx.py

    1、回忆有哪些图像处理操作?

    既然需要进行界面设计,那么首先我们应该回想的是对图像进行操作需要有哪些功能?怎么实现?当然,一般的方法就是每个功能对应一个按钮,通过点击按钮进行实现啦,这也是这次项目的整体构想,那么有哪些功能呢?一起回忆一下《OpenCV视觉之眼》前面所学习到的知识吧,大致可分为以下四个方面:
    1)、对图像的基本操作
    图像的读取、保存、显示、灰度处理
    2)、处理图像的基本步骤
    图像的灰度处理、低通高通滤波去噪、图像泛洪处理、图像中值、均值、高斯、方框滤波处理、图像阈值化处理、图像形态学处理(包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算、黑帽运算)、图像轮廓提取
    3)、图像中物体检测
    图像中硬币检测、图像直线和圆的检测、图像中物体的检测和识别
    4)、图像特效处理
    图像各种特效处理包括:素描、滤镜、毛玻璃、流年、油漆、怀旧、浮雕、缩放、旋转、马赛克、光照等
    在这里插入图片描述

    因此,以上功能我们可以通过按钮设置如下:

    2、图像处理的目的是什么?

    那么图像处理的目的是什么呢?当然是通过读取一张图像,处理到我们想要的样子然后对处理之后的图像进行保存,最后展示啦。因此,我们的需求如下
    1)、需要一个读取本地图像的按钮,和用于展示图像的框,如下:
    在这里插入图片描述
    2)、需要一个保存图像的功能,并有一个框用来展示处理之后图像的效果;如下:
    在这里插入图片描述
    3)、需要一个进度条,用来展示图像的处理过程速度,让我们知道图像处理到哪一步了,如下:
    在这里插入图片描述
    那么以上就是我们本项目最终的目的了,读取图像,处理图像、保存图像

    3、图像处理可视化界面一览

    该项目整体的界面设计如下所示:
    在这里插入图片描述

    三、OpenCV图像处理功能实现

    1、功能函数的编写

    对于各个功能函数的编写,在之前的章节中林君学长都通过原理编写过相关的程序,大家可以直接使用哪个,当然也可以自己根据原理进行书写,完成相关操作;本次项目与之前不同的是,每个py文件中林君学长都通过class类进行创建,也就是说,在类中的函数需要通过self调用,表示属于该类中的本身变量和函数;具体请到第四步,OpenCV图像处理最终章项目下载地址进行该项目下载运行查看完整代码!这里给出一个功能函数的编写,如下所示:包括进程的调用,进度条的使用、异常处理等

        def imageTogray(self):#通过原理实现灰度处理
            try:
                self.label_2.setScaledContents(True)
                img = cv2.imread(self.path)
                img = cv2.resize(img, (240, 240), interpolation=cv2.INTER_CUBIC)
                height, width = img.shape[:2]
                gray = np.zeros((height, width, 1), dtype="uint8")
                self.create_thread()
                for i in range(height):
                    for j in range(width):
                        gray[i][j]=img[i][j][0]*0.114+img[i][j][1]*0.587+img[i][j][2]*0.299 #加权值法
                        #gray[i][j] = (img[i][j][0] +img[i][j][1]+img[i][j][2])/3#平均值法
                        #gray[i][j] = max(img[i][j][0],img[i][j][1],img[i][j][2]) #最大值法
                    if i % int(height /100) == 0:
                        self.detectThread.timerEvent()
                self.detectThread.quit()
                height, width = gray.shape[:2]
                qimg = QImage(gray, width, height, QImage.Format_Grayscale8)
                qpix = QPixmap.fromImage(qimg)
                self.label_2.setPixmap(qpix)
            except:
                QMessageBox.about(self, "提示", "请先选择图片!")
    
    

    在这里插入图片描述

    2、按钮的事件绑定

    1)、对于按钮事件的绑定,当然是官方操作方法,具体按钮的事件绑定操作如下代码所示:

    self.pushButton.clicked.connect(self.openImage)
    self.pushButton_2.clicked.connect(self.imageTogray) #灰度
    self.pushButton_3.clicked.connect(self.Sketch)   #素描
    self.pushButton_4.clicked.connect(self.Nostalgia) #怀旧
    self.pushButton_5.clicked.connect(self.paint) #油漆
    

    3、PyQt5的文件打开与保存

    1)、文件打开功能实现
    PyQt5中提供了打开本地文件夹的函数,我们可以直接通过该函数进行打开本地文件夹进行图像读取,如下代码所示:

    self.path,ret=QFileDialog.getOpenFileName(self,"打开图片",".","图片格式(*.jpg)")
    

    在这里插入图片描述

    2)、文件保存功能实现
    同样的,PyQt5中也提供了打开本地文件夹进行保存的函数,我们可以直接通过该函数进行打开本地文件夹进行图像保存,如下代码所示:

    path, ret = QFileDialog.getSaveFileName(self, "选择保存文件路径", ".", "图片格式(*.jpg)")
    

    在这里插入图片描述

    4、OpenCV图像处理最终章项目下载地址

    该项目中的函数不用过多的解释,而对于该界面的设计,总体用PyQt5进行对应的布局,因此,可通过以下地址下载林君学长的源码进行参考,下载地址如下所示:
    https://download.csdn.net/download/qq_42451251/12745214

    在这里插入图片描述
    《OpenCV视觉之眼》专栏的图像处理知识讲解到此结束,希望OpenCV-Python对图像处理的这二十三章可以对学弟学妹们学习OpenCV图像处理有一定的帮助,同时,也希望《OpenCV视觉之眼》的这二十三章能够吸引到你们学习的兴趣,重视OpenCV对图像的处理原理,理解OpenCV官方库函数的基本使用方法,奠定你图像学的基础!

    《OpenCV视觉之眼》系列教程到此结束,但林君学长的博客教程系列还有很长的路要走,还需要学习和书写的教程很多,人工智能、嵌入式、网络安全、web前端等等等等;总之,这是林君学长第一次写由浅入深的学习教程,但承诺不会是最后一次^ _ ^

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

    人生逆境时,切记忍耐;人生顺境时,切记收敛;人生得意时,切记看淡;人生失意时,切记随缘。心情不好时,当需涵养;心情愉悦时,当需沉潜

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

    展开全文
  • 本专栏主要介绍如果通过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视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
    《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
    《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
    《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
    《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
    《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
    《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
    《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
    《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测

    上次博客介绍了图像的轮廓提取,并且通过参数调节得到我们预期的图像最后绘制在原图上,是对OpenCV各种库函数的基本运用,也为后面更加深入层次的项目实战做准备,为基于OpenCV的人工智能识别做准备。上次博客需要掌握的便是对参数调节方式和思维模式。

    本次博客,我们将在上次的基础上更新一点难度,除了将图像轮廓提取出来,并且需要将图像上的物体标注出来,同时截取出该物体,在后续的模型训练中,例如人脸识别的模型训练,在大多数时候我们只单单要人脸不需要人脸之外的其他东西,因此,我们需要将图像中的人脸截取出来然后进行模型训练,本次博客,便是为之后打下基础,一起学习吧!

    图像处理实战二:之图像中的物体识别并截取(以图像中的蜜蜂为例)

    一、Opencv图像处理实战二

    1、图像物体识别截取步骤

    对于图像中的物体识别的基本步骤和上次博客所讲解的基本步骤一致,包括数据准备、图像泛洪、灰度、高斯去噪、阈值化、形态学、边缘提取处理;唯一不同的是对边缘提取之后,是需要我们自己加一个框在轮廓上面,而不是直接将轮廓线条画在原图
    1)、数据准备,以蜜蜂为例
    在这里插入图片描述
    2)、图像读取并泛洪处理
    对于图像泛洪处理需要调节泛洪参数,如下的(3,3,3)和(4,4,4),根据图像泛洪的效果自己设定

    #对图像进行泛洪处理
    h, w = img1.shape[:2] #获取图像的长和宽
    mask = np.zeros((h+2, w+2), np.uint8)#设置掩码,进行图像填充
    cv2.floodFill(img1, mask, (w-1,h-1), (255,255,255), (3,3,3),(4,4,4),8) #对图像进行泛洪,去背景化
    

    在这里插入图片描述
    2)、图像灰度化

    #图像灰度化
    gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
    

    在这里插入图片描述
    3)、高斯滤波去噪,参数如下代码设置

    设置为17x17的高斯核,是通过不断观察后续图像效果得到的结果,因此,对参数的设计,是需要结合完整代码对图像的处理效果而做调整。

    #通过高斯滤波对图像进行模糊处理,可以理解为对图像硬币去噪
    blur=cv2.cv2.GaussianBlur(gray,(17,17),0,0)#这里可以用中值滤波,具体视对图像效果选择
    

    在这里插入图片描述
    4)、阈值化处理,将图像与噪声分类成0和255两种颜色

    梯度图像中不大于177的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)。

    #通过二进制阈值化对图像进行阈值化处理,将蜜蜂轮廓与周围噪声区分开来
    ret,thresh1=cv2.threshold(blur,177,255,cv2.THRESH_BINARY)
    

    在这里插入图片描述
    5)、图像形态学处理,去除图像内部噪声,如果图像内部无噪声,即图像阈值化后物体全黑,则可以省略该步骤

    图像轮廓内部有噪声点一般通过闭运算进行处理,外部有噪声点一般通过开运算进行处理

    #进行闭运算,去除图像内部噪声
    kernel = np.ones((7,7), np.uint8)#设置卷积核
    close=cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)#闭运算
    

    在这里插入图片描述
    6)、Canny算法进行图像轮廓提取,识别出图像中蜜蜂的轮廓线条

    #利用canny算法对图像进行轮廓提取
    Canny = cv2.Canny(close, 20, 150)
    

    在这里插入图片描述
    6)、提取出轮廓线条,并在原图绘制包含物体的最小矩形框

    #在提取出的轮廓图像中找出轮廓线条,并在原图上面画出矩阵框
    (cnts1,_) =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    c = sorted(cnts1, key=cv2.contourArea, reverse=True)[0]
    # 计算最大轮廓的旋转边界框
    rect = cv2.minAreaRect(c)
    #box里保存的是绿色矩形区域四个顶点的坐标(从边界框中提取出顶点坐标)
    box = np.int0(cv2.boxPoints(rect))
    #将box的顶点坐标绘制在图中并连接线条
    cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
    

    在这里插入图片描述

    cv2.minAreaRect()函数:
    主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行,在文章后面步骤部分会讲解

    7)、将图像中的矩形框中的图像进行裁剪,形成图像最大特征

    #对图像进行裁剪,在顶点坐标中找到(x,y)的最大值和最小值做差得到轮廓图像的矩形区域
    Xs = [i[0] for i in box]
    Ys = [i[1] for i in box]
    x1 = min(Xs)
    x2 = max(Xs)
    y1 = min(Ys)
    y2 = max(Ys)
    hight = y2 - y1
    width = x2 - x1
    newImg = img[y1:y1+hight, x1:x1+width]
    

    在这里插入图片描述

    box里保存的是绿色矩形区域四个顶点的坐标。按照图中四个顶点坐标位置裁剪昆虫图像。找出四个顶点的x,y坐标的最大最小值。
    新图像的高=maxY-minY,宽=maxX-minX

    2、图像物体识别截取完整代码

    1)、图像处理实战二完整代码

    '''
        OpenCV物体识别与裁剪
    '''
    #导入函数库
    import cv2
    import numpy as np
    #读取图像
    img=cv2.imread("bear.jpg")
    #将原图进行复制,进行泛洪处理
    img1=img.copy()
    #对图像进行泛洪处理
    h, w = img1.shape[:2] #获取图像的长和宽
    mask = np.zeros((h+2, w+2), np.uint8)#设置掩码,进行图像填充
    cv2.floodFill(img1, mask, (w-1,h-1), (255,255,255), (3,3,3),(4,4,4),8) #对图像进行泛洪,去背景化
    #图像灰度化
    gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
    #通过高斯滤波对图像进行模糊处理,可以理解为对图像硬币去噪
    blur=cv2.cv2.GaussianBlur(gray,(17,17),0,0)#这里可以用中值滤波,具体视对图像效果选择
    #通过二进制阈值化对图像进行阈值化处理,将蜜蜂轮廓与周围噪声区分开来
    ret,thresh1=cv2.threshold(blur,177,255,cv2.THRESH_BINARY)
    #进行闭运算,去除图像内部噪声
    kernel = np.ones((7,7), np.uint8)#设置卷积核
    close=cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)#闭运算
    #利用canny算法对图像进行轮廓提取
    Canny = cv2.Canny(close, 20, 150)
    #在提取出的轮廓图像中找出轮廓线条,并在原图上面画出矩阵框
    (cnts1,_) =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    c = sorted(cnts1, key=cv2.contourArea, reverse=True)[0]
    # 计算最大轮廓的旋转边界框
    rect = cv2.minAreaRect(c)
    #box里保存的是绿色矩形区域四个顶点的坐标(从边界框中提取出顶点坐标)
    box = np.int0(cv2.boxPoints(rect))
    #将box的顶点坐标绘制在图中并连接线条
    cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
    cv2.imshow("recognition",img)
    #对图像进行裁剪,在顶点坐标中找到(x,y)的最大值和最小值做差得到轮廓图像的矩形区域
    Xs = [i[0] for i in box]
    Ys = [i[1] for i in box]
    x1 = min(Xs)
    x2 = max(Xs)
    y1 = min(Ys)
    y2 = max(Ys)
    hight = y2 - y1
    width = x2 - x1
    newImg = img[y1:y1+hight, x1:x1+width]
    cv2.imshow("Tailoring",newImg)
    cv2.waitKey(0)
    

    2)、运行结果
    在这里插入图片描述

    3、代码中新函数介绍

    1)、图像泛洪函数原型:cv2.floodFill(img,mask,seed,newvalue(BGR),(a,b,c),(a1,b1,c1),flag)

    • img:需要泛洪处理的目标图像
    • mask:掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数+2,列数+2.是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵【dtype:np.uint8】
    • seed:泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理
    • newvalue(BGR):对于泛洪区域新赋的值(B,G,R)例如白色(255,255,255)
    • (a,b,c):是相对于seed种子点像素可以往下的像素值,即seed(B0,G0,R0),泛洪区域下界为(B0-a,G0-b,R0-c)
    • (a1,b1,c1):是相对于seed种子点像素可以往上的像素值,即seed(B0,G0,R0),泛洪区域上界为(B0+a1,G0+a2,R0+a3)
    • flag:为泛洪算法的处理模式
    • flag可设置参数如下:
      低八位:控制算法的连通性,是以seed点为中心,接着判断周围的几个像素点,再将泛洪区域像素点周围的几个像素点进行考虑。 一般为4,8;默认为4
      中间八位:与掩码层赋值密切相关,一般使用(255<<8)使中间8位全位1,则值为255,也就是掩码层对应原图的泛洪区域的部分被由原来的初值0赋值成255,如果中间8位为0,则赋值为1.
      高八位:由opencv宏参数指定,如下所示:
      • cv2.FLOODFILL_FIXED_RANGE:改变图像,填充newvalue
      • cv2.FLOODFILL_MASK_ONLY:不改变原图像,也就是newvalue参数失去作用,而是改变对应区域的掩码,设为中间八位的值

    2)、sorted()函数为python内置函数,功能是该函数对所有可迭代的对象进行排序操作,原型如下:
    sorted(iterable, key=None, reverse=False)

    • iterable: 可迭代对象
    • key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    • reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)

    3)、计算轮廓面积cv2.contourArea()原型:cv2.contourArea(cnt, True)

    • cnt:输入的单个轮廓值
    • True:该函数返回一个带符号的面积,其正负取决于轮廓的方向(顺时针还是逆时针);如果是False,则面积以绝对值的形式返回

    注意:以上函数作为sorted()函数中的key传递进去了哦!

    4)、旋转边界cv2.minAreaRect()原型:result=cv2.minAreaRect(Points)

    • Points:点集,数据类型为ndarray,array((x1,y1),(x2,y2),…,(xn,yn)
    • result:函数返回对象
      • result[0]返回矩形的中心点:(x,y),实际上为y行x列的像素点
      • result[1]返回矩形的长和宽,顺序一定不要弄错,在旋转角度上有很重要的作用
      • result[2]返回矩形的旋转角度
        在这里插入图片描述
        angel是由x轴逆时针转至W(宽)的角度;角度范围是[-90,0)

    提示:minAreaRect就是求出在上述点集下的最小面积矩形

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

    懂得感恩的人,往往是有谦虚之德的人,是有敬畏之心的人。对待比自己弱小的人,知道要躬身弯腰,便是属于前者;感受上苍懂得要抬头仰视,便是属于后者。

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

    展开全文
  • 本篇推文共计1000个字,阅读时间约3分钟。OpenCV是一个C++库,目前流行...本文将介绍如何在Python3中使用OpenCV实现图像处理的基础操作:读入图像,显示图像复制图像,保存图像 电脑环境准备Python版本:Python3...
  • 1、访问和修改像素值加载彩色图像:importnumpy as npimportcv2 as cvimage=cv.imread("dog2.jpg",1)谷歌colab上显示图像:from google.colab.patches importcv2_imshowcv2_imshow(image)你可以通过行和列坐标来访问...
  • 重映射的概念:把一副图像内的像素点放置到另外一副图像内的指定位置,这个过程叫做重映射 重映射可以实现的功能有,图片的复制,图片绕x轴翻转,绕y轴翻转,绕xy轴翻转,x和y轴互换等功能 现在举一个简单的例子,...
  • 原始图像 根据图像的边界的像素值,向外扩充图片,每个方向扩充50个像素。 a = cv2.copyMakeBorder(img,50,50,50,50,cv2.BORDER_REPLICATE) ...以上这篇python opencv 实现图像边缘扩充就是小编分
  • 这篇博客,展示了如何使用PythonOpenCV图像之间执行超快速的颜色转移。 然后,我基于Reinhard等人提供了一个实现。与基于直方图的颜色转移方法不同,该方法需要计算每个通道的CDF,然后构造查找表(LUT),该...
  • 今天我们就用python语言基于OpenCV实现孔洞填充。 代码实现: import cv2; import numpy as np; ''' 图像说明: 图像为二值化图像,255白色为目标物,0黑色为背景 要填充白色目标物中的黑色空洞 ''' def FillHole...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 上几篇的内容我们学习了Python使用OpenCV处理图像鼠标及键盘事件的基础方法使用Python OpenCV处理图像之详解使用OpenCV处理键盘鼠标事件及图像像素点内容的获取和设置使用Python OpenCV处理图像之使用OpenCV获取并...
  • 今天我们就用python语言基于OpenCV实现孔洞填充。 代码实现: import cv2; import numpy as np; def FillHole_RGB(imgPath,SavePath): # 读取图像为uint32,之所以选择uint32是因为下面转为0xbbggrr不溢出 im_in_...
  • 原标题:基于python+opencv图像目标区域自动提取一、提取纸张中的内容一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要想把照片翻转到平行位置,需要进行透视变换,而透视变换需要同一像素点...
  • 我把代码放到一起了,要是运行的话最好复制到新的python文件里运行哦 以下为BB子整理的OpenCV中基本的轮廓处理部分 #program 1.绘制轮廓 import numpy as np import cv2 as cv #读取图像 img = cv.imread("G:\...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。...
  • 1.实现效果:左边是Python代码的运行界面。可以看到在输出行有[249 221 187]三个数字,因为我在右侧的图片上点击了某个区域,因此就输出了所点击区域的RGB颜色。RGB颜色就是三原色,三原色进行搭配可以形成任意颜色...
  • Py之cv2:cv2库(OpenCVopencv-python)的简介、安装、使用方法(常见函数、方法等)最强详细攻略 目录 关于OpenCV简介 OpenCV应用领域 1、计算机视觉领域方向 2、计算机操作底层技术 安装OpenCV的的两种方法 ...
  • Pycharm直接pip install安装opencv-pythonopencv-contrib-python,注意的是安装opencv-python-headless会导致imshow等涉及UI的方法不能用。 其中,opencv-python只包含了OpenCV的主要模块,而opencv-contrib-...
  • OpenCV图像复制

    2018-08-31 12:55:00
    2019独角兽企业重金招聘Python工程师标准>>> ...
  • 本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python...[Python图像处理十 ]:Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法一、开运算1、开运算原理2、开运算功能函数构造3、Op
  • 带有Python的Tesseract-OCR和Opencv的PDI(数字图像处理)算法,用于识别车辆图像/视频中的识别牌。 IDE PyCharm上可用的项目 库:OpenCV- ://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials....
  • python-opencv图像素描 #参考PS素描的实现步骤,先去色将彩色图像装换成灰度图,复制去色层进行反色, 对反色图像进行高斯模糊,模糊后的图像叠加模式选择颜色减淡效果 import cv2 import numpy as np def ...
  • OpenCV是著名的跨平台计算机...Opencv移植进Android平台可以在移动端实现图像的处理,目标的识别等功能,具有良好的开发前景。 一.开发准备 第一步主要是搭好开发环境,将Opencv导入到Android Studio,可以直接在Andr
  • OpenCV图像坐标系统与Python中NumPy Arrays之间的关系 文章目录OpenCV图像坐标系统与Python中NumPy Arrays之间的关系前言:参考链接:image.shape和长宽的关系:OpenCV中的图像坐标系 行列宽和高x和yPython中...
  • 转自:... 一.... 1) 图像大小变换 cvResize () 原型: voidcvResize(const CvArr* src,CvArr* dst,intinterpolation=CV_INTER_LINEAR ); 说明: src 表示输入图像。dst表示输出图像。i...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,147
精华内容 2,458
关键字:

opencv实现图像复制python

python 订阅