opencv-python基础用法详细代码-图片加载-ROI-边缘滤波-二值化-轮廓提取-膨胀腐蚀等

Posted zzg1097940918

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv-python基础用法详细代码-图片加载-ROI-边缘滤波-二值化-轮廓提取-膨胀腐蚀等相关的知识,希望对你有一定的参考价值。

目录      

1.1图像的导入和导出

1.2像素运算

1.3ROI与填充

1.4模糊与锐化操作

1.5边缘保留滤波

1.6图像二值化

1.7图像直方图

1.8绘制外轮廓

1.9对象测量

1.10区分指定外轮廓

1.11腐蚀与膨胀

1.12开闭操作


 可以下面代码直接运行,也可以看我的b站视频,有配套的教学,代码演示,有问题的可以留言。b站视频传送门

废话不多说,直接上代码

1.1图像的导入和导出

import cv2                 #导入opencv库

def get_image_info(image):     #定义加载图像信息函数
    print(type(image))         #读取该图片类别
    print(image.shape)         #加载图像的长宽和通道数
    print(image.size)          #加载图像的大小
    print(image.dtype)         #加载字节位数占多少

img = cv2.imread('1.jpg')    #读入图片
cv2.imshow('image', img)     #图片显示
get_image_info(img)          #调用加载图片信息函数
cv2.waitKey(0)     #等待时间

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   #灰度化
cv2.imwrite('./2.jpg', gray)      #写出图片到当前文件夹下
cv2.waitKey(0)

加载并显示图片1.jpg,然后灰度化,并保存在本地

1.2像素运算

import cv2 as cv

def add_demo(m1, m2):   #定义像素相加函数
    dst = cv.add(m1, m2)     #对像素进行加法运算
    cv.imshow("add_demo", dst)   #显示像素相加后的图像

def subtract_demo(m1, m2):
    dst = cv.subtract(m1, m2)
    cv.imshow("subtract_demo",dst)

scr1 = cv.imread("3.jpg")    #读入当前文件夹下名称为3.jpg图片
scr2 = cv.imread("4.jpg")    #读入4.jpg图片
print(scr1.shape)   #显示图片3的大小
print(scr2.shape)   #显示图片4的大小 进行像素加减乘除需要两个图片格式大小一样
cv.imshow("image1",scr1)    #显示原图3
cv.imshow("image2",scr2)    #显示原图4

add_demo(scr1, scr2)   #调用加法运算
subtract_demo(scr1, scr2)   #调用减法运算
cv.waitKey(0)

图像直接的像素相加相减后合并成一张图片

1.3ROI与填充

import cv2 as cv
import numpy as np

src = cv.imread('1.jpg')  #读取图片
cv.imshow("input image", src)    #显示原图片
face = src[250:450, 150:450]      #选择区域
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)    #选择区域灰度化
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)    #将gray转回BGR格式,因为下面图片合并需要通道数一样
src[250:450, 150:450] = backface   #合并图像
cv.imshow('face',src)    #显示图像
cv.waitKey(0)           #等待时间

def fill_color_demo(image):   #定于彩色填充图像函数
    copyImg = image.copy()    #拷贝出新图像
    h,w = image.shape[:2]     #获取长宽
    mask = np.zeros([h+2, w+2], np.uint8)   #创建mask大小,且必须是8位
    cv.floodFill(copyImg, mask, (30,30), (0, 255, 255), (50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
    #泛洪填充,第三个参数填充起始点,4重新填充像素值,5填充的最低像素范围 6填充的最高范围 7考虑当前像素与种子像素之差
    cv.imshow("fill_color_demo", copyImg)  #显示图片

src2 = cv.imread('1.jpg')
fill_color_demo(src2)
cv.waitKey(0)

选择一个区域继续颜色变化,或想PS油漆桶功能一样点击一个点进行泛宏填充。

1.4模糊与锐化操作

import cv2 as cv
import numpy as np

src = cv.imread('1.jpg')  #导入图片
cv.imshow('1.jpg',src)    #显示原图


def blur_demo(image):  #定义模糊函数
    dst = cv.blur(image,(15,15))    #水平和垂直方向各模糊15个单位
    cv.imshow('blur_image',dst)

def custom_blur_demo(image):   #自定义图片卷积处理函数
    kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)    #定义3×3的卷积核
    dst = cv.filter2D(image, -1, kernel=kernel)  #调用卷积函数,第一个参数原图片,第二参数目标图像所需深度,第三参数卷积核
    cv.imshow('custom_blur_demo',dst)          #显示卷积后图像,卷积核的数不同效果不同,这里是锐化

blur_demo(src)   #调用模糊函数
custom_blur_demo(src)
cv.waitKey(0)

图片变模糊和图片变锐化更加清晰

1.5边缘保留滤波

import cv2 as cv
import numpy as np

src = cv.imread('5.jpg')  #导入图片
cv.imshow('5.jpg',src)    #显示原图

def bi_demo(image):     #定义滤波函数
    dst = cv.bilateralFilter(image,0,100, 15)
#调用双边滤波函数,第一个参数原图,第二个参数每个像素直径范围,第三个参数融合周边像素颜色,第四个参数相似颜色像素相互影响
    cv.imshow('bi_demo', dst)  #输出滤波后图像

bi_demo(src)
cv.waitKey(0)

效果类似美颜

1.6图像二值化

import cv2 as cv
import numpy as np

src = cv.imread('1.jpg')  #导入图片
cv.imshow('1.jpg',src)    #显示原图

def threshold_demo(image):                          #定义二值化函数
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)            #图片灰度化处理
    ret,binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY|cv.THRESH_OTSU)
    #调用二值化函数 第一个参数为输入图像,第二参数为进行分类的像素,第三个参数表示阈值,第四参数表示运算方法
    print("threshold value %s"%ret)     #输出划分像素点
    cv.imshow("binary",binary)           #显示图像

threshold_demo(src)
cv.waitKey(0)

1.7图像直方图

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

src = cv.imread('1.jpg')  #导入图片
cv.imshow('1.jpg',src)    #显示原图

def plot_demo(image):
    plt.hist(image.ravel(), 256, [0, 256])  # image.ravel()是将多维数组降为一维数组,256为bins数量,[0, 256]为范围,计算像素个数
    plt.show()


def image_hist(image):
    color = ('blue', 'green', 'red')
    for i, color in enumerate(color):
        # 计算出直方图,calcHist(images, channels, mask, histSize(有多少个bin), ranges[, hist[, accumulate]]) -> hist
        # hist 是一个 256x1 的数组,每一个值代表了与该灰度值对应的像素点数目。
        hist = cv.calcHist(image, [i], None, [256], [0, 256])
        print(hist.shape)
        plt.plot(hist, color=color)
        plt.xlim([0, 256])
    plt.show()

image_hist(src)
plot_demo(src)
cv.waitKey(0)

1.8绘制外轮廓

import cv2 as cv
import numpy as np

src = cv.imread('6.jpg')  #导入图片
cv.imshow('6.jpg',src)    #显示原图
def contours_demo(image):                 #定义轮廓发现函数
    dst = cv.GaussianBlur(image, (3,3),0)    #调用高斯模糊,第二个参数内核大小,第三个参数高斯核标准偏差
    gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY)              #图像灰度化
    ret,binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY| cv.THRESH_OTSU)   #图像二值化
    cv.imshow("binary image", binary) #输出图像

    contours,heriachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
    #调用检测物体轮廓函数,第一个参数寻找轮廓的图像,第二个参数表示轮廓的检索模式,有 cv2.RETR_EXTERNAL表示只检测外轮廓
    # cv2.RETR_LIST检测的轮廓不建立等级关系 cv2.RETR_CCOMP建立两个等级的轮廓cv2.RETR_TREE建立一个等级树结构的轮廓。
    #第三个参数为轮廓的近似办法,cv2.CHAIN_APPROX_SIMPLE压缩各方向的元素
    #最后返回图像、轮廓信息、层次信息
    for i ,contour in enumerate(contours):
        cv.drawContours(image,contours,i,(0,0,255),2)
        #第一个参数指在哪幅图上绘制轮廓信息,第二个参数是轮廓本身,第三个参数是指定绘制哪条轮廓
        #第四个参数是绘图的颜色,第五个参数是绘制的线宽 输入-1则表示填充
        print(i)
    cv.imshow("detect contours",image)


contours_demo(src)
cv.waitKey(0)

1.9对象测量-目标面积计算

import cv2 as cv
import numpy as np

src = cv.imread('8.jpg')  #导入图片
cv.imshow('8.jpg',src)    #显示原图

def measure_object(image):          #定义测量函数
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)                    #图像灰度化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)  # 图像二值化 cv.THRESH_BINARY_INV是取反
    print("threshold value:%s"%ret)    #输出阈值
    cv.imshow("binary image", binary)  # 输出图像
    contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 调用检测物体轮廓函数
    for i ,contour in enumerate(contours):
        area = cv.contourArea(contour)           #求取面积
        x, y, w, h = cv.boundingRect(contour)          #轮廓外接矩形
        mm = cv.moments(contour)                 #计算图像中心矩
        rate = min(w, h)/max(w, h)            #计算宽高比
        print('rectangle rate:%s'%rate)         #输出宽高比
        cx = mm['m10']/mm['m00']
        cy = mm['m01']/mm['m00']          #找出轮廓的中心位置
        cv.circle(image, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
        # 用个黄色小圆圈把几何图形的中心位置绘制出来, 第三个参数是半径,第四个参数是颜色
        cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
        #用红色框框把外接矩形绘制出来
        print("contour area %s"%area)
    cv.imshow("detect contours", image)
measure_object(src)
cv.waitKey(0)

1.10区分指定外轮廓

import cv2 as cv
import numpy as np

src = cv.imread('7.jpg')
cv.imshow('7.jpg',src)

def measure_object(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print("threshold value:%s"%ret)
    cv.imshow("binary image", binary)
    dst = cv.cvtColor(binary,cv.COLOR_GRAY2BGR)    #'''还原三通道图片'''
    contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    for i ,contour in enumerate(contours):
        area = cv.contourArea(contour)
        x, y, w, h = cv.boundingRect(contour)
        mm = cv.moments(contour)
        rate = min(w, h)/max(w, h)
        print('rectangle rate:%s'%rate)
        cx = mm['m10']/mm['m00']
        cy = mm['m01']/mm['m00']
        cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)

        approxCurve = cv.approxPolyDP(contour,4,True)
        #'''调用固定边数精度函数 第二参数指定原始曲线与近似曲线之间最大距离精度 第三参数近似曲线闭合'''
        print(approxCurve.shape)
        if approxCurve.shape[0] > 4:     # '''判断图形边数是否大于4'''
            cv.drawContours(dst, contours, i, (0,255,0),2)   #'''将符合要求的用绿色轮廓输出'''

        print("contour area %s"%area)
    cv.imshow("detect contours", dst)
measure_object(src)
cv.waitKey(0)

1.11腐蚀与膨胀

import cv2 as cv
import numpy as np

src = cv.imread('9.jpg')  #导入图片
cv.imshow('9.jpg',src)    #显示原图

def erode_demo(image):                    #定义腐蚀函数
    print(image.shape)                    #显示图片格式
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)    #图像灰度化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  #二值化
    cv.imshow("binary",binary)        #显示二值化后的图片
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,8))
    #建立指定结构 第一个参数定义形状,这里是方形,第二个参数指定程度
    dst = cv.erode(binary,kernel)          #腐蚀
    cv.imshow("erode_demo", dst)          #输出图像

def erode_dilate(image):          #定义膨胀函数
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary",binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,8))
    dst = cv.dilate(binary,kernel)              #膨胀
    cv.imshow("erode_dilate", dst)

erode_dilate(src)
erode_demo(src)
cv.waitKey(0)

1.12开闭操作

#先腐蚀再膨胀就是开操作,先膨胀再腐蚀就是闭操作
import cv2 as cv
import numpy as np

src = cv.imread('10.jpg')  #导入图片
cv.imshow('10.jpg',src)    #显示原图

def open_demo(image):                           #自定义开操作函数
    print(image.shape)                             #显示图片格式
    gray =  cv.cvtColor(image, cv.COLOR_BGR2GRAY)    #图像灰度化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  # 二值化
    cv.imshow("binary", binary)  # 显示二值化后的图片
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (6, 6))
    # 建立指定结构 第一个参数定义形状,这里是方形,第二个参数指定程度
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN,kernel)
    #进行形态学操作,参数1传入图片,参数2进行开运算,参数3表示方框大小
    cv.imshow('open-result',binary)

def close_demo(image):                           #自定义闭操作函数
    print(image.shape)                             #显示图片格式
    gray =  cv.cvtColor(image, cv.COLOR_BGR2GRAY)    #图像灰度化
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)  # 二值化
    cv.imshow("binary", binary)  # 显示二值化后的图片
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (10, 10))
    # 建立指定结构 第一个参数定义形状,这里是方形,第二个参数指定程度
    binary = cv.morphologyEx(binary, cv.MORPH_CLOSE,kernel)   #参数2改成闭操作运算
    cv.imshow('close-result',binary)


open_demo(src)
close_demo(src)
cv.waitKey(0)

以上opencv-python的基本操作代码更新完毕,下一章更新使用opencv-python进行人脸检测。

以上是关于opencv-python基础用法详细代码-图片加载-ROI-边缘滤波-二值化-轮廓提取-膨胀腐蚀等的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-Python基础教程2-PyQt编写GUI界面

以代码为基础的opencv-python学习 图像二值化

python大佬为你详细讲解使用opencv-python提取手掌和手心及部分掌纹

OpenCV-Python 第三章

OpenCV-Python计算机视觉函数

以代码为基础的opencv-python学习 图像模糊