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界面