OpenCV图像处理:阈值分割、边缘检测、数学形态学、滤波

您所在的位置:网站首页 图像处理软件功能包括 OpenCV图像处理:阈值分割、边缘检测、数学形态学、滤波

OpenCV图像处理:阈值分割、边缘检测、数学形态学、滤波

2024-06-20 17:03| 来源: 网络整理| 查看: 265

1. OpenCV简介 在这里插入图片描述

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上(未来期待在Harmony OS上运行). 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

2. Opencv模块

模块 功能 Core 核心模块,包含最基础的操作 Imgproc 图像处理模块 Objdectect 目标检测模块 Feature2D 2D特征检测模块 Video 视频处理模块 HighGUI 高层图像用户界面 Calib3d 3D重建模块 ML 机器学习模块 FLANN 最近邻搜索模块 Stitching 图像拼接模块 Photo 计算图像学 Superres 超分辨率模块 GPU GPU并行加速模块

3. OpenCV总览

在这里插入图片描述

OpenCV框架中的每一个模块都包含大量的计算机视觉方法,每一个模块都能独当一面,功能强大。

本篇文章将介绍OpenCV库中最重要的模块:Imgproc(图像处理模块)。

在这里插入图片描述

图像处理模块包括:图像的读取、显示、保存;几何运算;灰度变换;几何变换;平滑、锐化;数学形态学;阈值分割;边缘检测;色彩空间;形状绘制等。

@[toc] 图像读取、显示、保存 函数 功能 cv2.imread( ) 图像读取 cv2.imshow( ) 图像显示 cv2.imwrite( ) 图像保存 """图像读取、显示、保存""" img = cv2.imread('shiyuan.png') cv2.imwrite('shi.png',img) cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

几何运算 函数 功能 img1+img2 图像加法 cv2.addWeight( ) 图像融合 """几何运算""" img1 = cv2.imread('shiyuan.png') img2 = cv2.imread('lizi.png') img3 = cv2.resize(img1,(300,300))+cv2.resize(img2,(300,300)) img4 = cv2.addWeighted(cv2.resize(img1,(300,300)),0.3,cv2.resize(img2,(300,300)),0.7,20) cv2.imshow('img3',img3) cv2.imshow('img4',img4) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

在这里插入图片描述

灰度变换 函数 功能 对数变换 变换图像灰度 伽马变换 变换图像灰度 直方图均衡化 变换图像灰度 直方图规定化 变换图像灰度 """灰度变换""" import cv2 import copy img = cv2.imread('bai.png',1) img1 = cv2.imread('bai.png',0) img = cv2.resize(img,(400,300)) img1 = cv2.resize(img,(400,300)) gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #伽马变换 gamma = copy.deepcopy(gray) rows = img.shape[0] cols = img.shape[1] for i in range(rows): for j in range(cols): gamma[i][j]=3*pow(gamma[i][j],0.8) cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('gamma',gamma) cv2.waitKey(0) cv2.destroyAllWindows() """灰度变换""" import cv2 import copy import math img = cv2.imread('bai.png',1) img1 = cv2.imread('bai.png',0) img = cv2.resize(img,(400,300)) img1 = cv2.resize(img,(400,300)) gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #对数变换 logc = copy.deepcopy(gray) rows=img.shape[0] cols=img.shape[1] for i in range(rows): for j in range(cols): logc[i][j] = 3 * math.log(1 + logc[i][j]) cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('logc',logc) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

"""灰度变换""" import cv2 import copy import math img = cv2.imread('bai.png',1) img1 = cv2.imread('bai.png',0) img = cv2.resize(img,(400,300)) img1 = cv2.resize(img,(400,300)) gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 反色变换 cover=copy.deepcopy(gray) rows=img.shape[0] cols=img.shape[1] for i in range(rows): for j in range(cols): cover[i][j]=255-cover[i][j] #通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量 cv2.imshow('img',img) cv2.imshow('gray',img1) cv2.imshow('cover',cover) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

#直方图规定化 import cv2 import numpy as np import matplotlib.pyplot as plt img0=cv2.imread('hua.png')#读取原图片 scr=cv2.imread('tu.png')#读取目标图片 #把两张图片转成真正的灰度图片,因为自己只会做灰度图片的规定化 img0=cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY) img=img0.copy()#用于之后做对比图 scr=cv2.cvtColor(scr,cv2.COLOR_BGR2GRAY) mHist1=[] mNum1=[] inhist1=[] mHist2=[] mNum2=[] inhist2=[] #对原图像进行均衡化 for i in range(256): mHist1.append(0) row,col=img.shape#获取原图像像素点的宽度和高度 for i in range(row): for j in range(col): mHist1[img[i,j]]= mHist1[img[i,j]]+1#统计灰度值的个数 mNum1.append(mHist1[0]/img.size) for i in range(0,255): mNum1.append(mNum1[i]+mHist1[i+1]/img.size) for i in range(256): inhist1.append(round(255*mNum1[i])) #对目标图像进行均衡化 for i in range(256): mHist2.append(0) rows,cols=scr.shape#获取目标图像像素点的宽度和高度 for i in range(rows): for j in range(cols): mHist2[scr[i,j]]= mHist2[scr[i,j]]+1#统计灰度值的个数 mNum2.append(mHist2[0]/scr.size) for i in range(0,255): mNum2.append(mNum2[i]+mHist2[i+1]/scr.size) for i in range(256): inhist2.append(round(255*mNum2[i]))

在这里插入图片描述

几何变换 函数 功能 cv2.resize( ) 图像缩放 cv2.warpAffine( ) 图像平移 cv2.getRotationMatrix2D( ) cv2.warpAffine( ) 图像旋转 cv2.getAffineTransform( ) cv2.warpAffine( ) 仿射变换 cv2.getPerspectiveTransform( ) cv2.warpPerspective( ) 透射变换 cv2.pyrUp( ) 高斯金字塔上采样 cv2.pyrDown( ) 高斯金字塔下采样 img-cv2.pyrUp(cv2.pyrDown(img)) 拉普拉斯金字塔 """几何变换""" img = cv2.imread('shiyuan.png') img1 = cv2.resize(img,(300,300)) M = np.float32([[1,0,30],[0,1,60]]) img2 = cv2.warpAffine(img1,M,(300,300)) img2 = cv2.putText(img2,'panning',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2) M = cv2.getRotationMatrix2D(((300-1)/2.0,(300-1)/2.0),45,1) img3 = cv2.warpAffine(img1,M,(300,300)) img3 = cv2.putText(img3,'rotation',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2) matr1 = np.float32([[50,50],[200,50],[50,200]]) matr2 = np.float32([[10,100],[200,50],[100,250]]) M = cv2.getAffineTransform(matr1,matr2) img4 = cv2.warpAffine(img1,M,(300,300)) img4 = cv2.putText(img4,'affine',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2) matr1 = np.float32([[56,65],[368,52],[28,387],[389,390]]) matr2 = np.float32([[0,0],[300,0],[0,300],[300,300]]) M = cv2.getPerspectiveTransform(matr1,matr2) img5 = cv2.warpPerspective(img1,M,(300,300)) img5 = cv2.putText(img5,'perspective',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('img3',img3) cv2.imshow('img4',img4) cv2.imshow('img5',img5) cv2.waitKey(0) cv2.destroyAllWindows()

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

"""图像金字塔""" import cv2 #高斯金字塔 def pyramid_demo(image): level = 2 temp = image.copy() pyramid_images = [] for i in range(level): dst = cv2.pyrDown(temp) pyramid_images.append(dst) cv2.imshow("pyramid"+str(i+1), dst) temp = dst.copy() return pyramid_images #拉普拉斯金字塔 def lapalian_demo(image): pyramid_images = pyramid_demo(image) level = len(pyramid_images) for i in range(level-1, -1, -1): if (i-1) < 0: expand = cv2.pyrUp(pyramid_images[i], dstsize = image.shape[:2]) lpls = cv2.subtract(image, expand) cv2.imshow("lapalian_down_"+str(i+1), lpls) else: expand = cv2.pyrUp(pyramid_images[i], dstsize = pyramid_images[i-1].shape[:2]) lpls = cv2.subtract(pyramid_images[i-1], expand) cv2.imshow("lapalian_down_"+str(i+1), lpls) src = cv2.resize(cv2.imread('shiyuan.png'),(256,256)) cv2.namedWindow('input_image') cv2.imshow('input_image', src) lapalian_demo(src) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

"""直方图均衡化""" import cv2 import numpy as np img = cv2.imread('bai.png',0) img = cv2.resize(img,(400,300)) equ = cv2.equalizeHist(img) cv2.imshow('img',equ) cv2.waitKey() cv2.destroyAllWindows() 平滑、锐化 函数 功能 cv2.blur( ) 均值滤波 cv2.GaussianBlur( ) 高斯滤波 cv2.medianBlur( ) 中值滤波 cv2.bilateralFilter( ) 双边滤波 """平滑、锐化""" import cv2 img = cv2.imread('shiyuan.png') img = cv2.resize(img,(300,300)) img1 = cv2.blur(img,(11,11)) img2 = cv2.GaussianBlur(img,(11,11),0) img3 = cv2.medianBlur(img,11) img4 = cv2.bilateralFilter(img,9,75,75) M = np.ones((5, 5), np.float32) / 25 img5 = cv.filter2D(img, -1, M) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('img3',img3) cv2.imshow('img4',img4) cv2.imshow('img5',img5) cv2.waitKey(0) cv2.destroyAllWindows() 数学形态学 函数 功能 cv2.erode( ) 腐蚀 cv2.dilate( ) 膨胀 cv2.morphologyEx(,cv2.MORPH_OPEN) 开运算 cv2.morphologyEx(,cv2.MORPH_CLOSE) 闭运算 cv2.morphologyEx(,cv2.MORPH_TOPHAT) 顶帽运算 cv2.morphologyEx(,cv2.MORPH_BLACKHAT) 底帽运算 cv2.morphologyEx(,cv2.MORPH_GRADIENT) 形态学梯度 "数学形态学" import cv2 img = cv2.imread('shiyuan.png') img = cv2.resize(img,(300,300)) kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) img1 = cv2.dilate(img, kernel) img2 = cv2.erode(img,kernel) #设置结构元 kernel_rect=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) kernel_cross=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3)) kernel_ellipse=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)) #图像开运算处理 open_rect=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_rect) open_cross=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_cross) open_ellipse=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_ellipse) #图像闭运算处理 close_rect=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_rect) close_cross=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_cross) close_ellipse=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_ellipse) gradient_rect = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_rect) gradient_cross = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_cross) gradient_ellipse = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_ellipse) #顶帽变换 tophat_rect=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_rect) tophat_cross=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_cross) tophat_ellipse=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_ellipse) #顶帽变换 blackhat_rect=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_rect) blackhat_cross=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_cross) blackhat_ellipse=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_ellipse) cv2.imshow('blackhat_rect',blackhat_rect) cv2.imshow('blackhat_cross',blackhat_cross) cv2.imshow('blackhat_ellipse',blackhat_ellipse) cv2.imshow('tophat_rect',tophat_rect) cv2.imshow('tophat_cross',tophat_cross) cv2.imshow('tophat_ellipse',tophat_ellipse) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('open_rect',open_rect) cv2.imshow('open_cross',open_cross) cv2.imshow('open_ellipse',open_ellipse) cv2.imshow('close_rect',close_rect) cv2.imshow('close_cross',close_cross) cv2.imshow('close_ellipse',close_ellipse) cv2.imshow('gradient_rect',gradient_rect) cv2.imshow('gradient_cross',gradient_cross) cv2.imshow('gradient_ellipse',gradient_ellipse) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

阈值分割 函数 功能 cv2.threshold(,cv2.THRESH_BINARY) 二值化阈值 cv2.threshold(,cv2.THRESH_BINARY_INV) 反二值化阈值 cv2.threshold(,cv2.THRESH_TOZERO) 低阈值零处理 cv2.threshold(,cv2.THRESH_TOZERO_INV) 超阈值零处理 cv2.threshold(,cv2.THRESH_OSTU) 大津算法 cv2.threshold(,cv2.THRESH_TRIANGLE) 截断阈值化处理 cv2.adaptiveThreshold(,,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,) 自适应阈值处理 cv2.adaptiveThreshold(,,cv2.ADAPTIVE_THRESH_MEAN_C,) 自适应阈值处理 "阈值分割" import cv2 img = cv2.imread('shiyuan.png') img = cv2.resize(img,(400,300)) img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret,img1 = cv2.threshold(img,110,255,cv2.THRESH_BINARY) ret,img2 = cv2.threshold(img,110,255,cv2.THRESH_BINARY_INV) ret,img3 = cv2.threshold(img,110,255,cv2.THRESH_TOZERO) ret,img4 = cv2.threshold(img,110,255,cv2.THRESH_TOZERO_INV) ret,img5 = cv2.threshold(img,110,255,cv2.THRESH_TRUNC) ret,img6 = cv2.threshold(img,110,255,cv2.THRESH_TRIANGLE) ret,img7 = cv2.threshold(img,110,255,cv2.THRESH_OTSU) ret,img8 = cv2.threshold(cv2.GaussianBlur(img,(7,7),0),110,255,cv2.THRESH_OTSU) img9 = cv2.adaptiveThreshold(img,127, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 11) img10 = cv2.adaptiveThreshold(img,127,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,11) cv2.imshow('img',img) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('img3',img3) cv2.imshow('img4',img4) cv2.imshow('img5',img5) cv2.imshow('img6',img6) cv2.imshow('img7',img7) cv2.imshow('img8',img8) cv2.imshow('img9',img9) cv2.imshow('img10',img10) cv2.waitKey(0) cv2.destroyAllWindows() 边缘检测 函数 功能 cv2.Canny( ) Canny算子 cv2.findContours( ) 轮廓检测 cv2.filter2D( ) 边缘提取 "边缘检测" import cv2 img = cv2.imread('bai.png') img = cv2.resize(img,(400,300)) img1 = cv2.Canny(img,123,5) cv2.imshow('img1',img1) cv2.waitKey(0) cv2.destroyAllWindows() """边缘检测""" import cv2 img = cv2.imread('bai.png') img = cv2.resize(img,(400,300)) gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cv2.drawContours(img,contours,-1,(0,0,255),1) cv2.imshow("img", img) cv2.waitKey(0) cv2.destroyAllWindows() """边缘检测""" import cv2 import numpy as np def find_contours(kernel): img = cv2.imread('bai.png') img = cv2.resize(img,(400,300)) img1 = cv2.filter2D(img,-1,kernel) cv2.imshow('img1',img1) cv2.waitKey(0) cv2.destroyAllWindows() kernel1 = np.array(( [0.0625, 0.125, 0.0625], [0.125, 0.25, 0.125], [0.0625, 0.125, 0.0625]), dtype="float32") #Sobel算子 kernel2 = np.array(([-1,-2,-1], [0,0,0], [1,2,1])) kernel3 = np.array(([-2,-1,0], [-1,1,1], [0,-1,-2])) kernel4 = np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]]) kernel5 = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]]) kernel6 = np.array([[0,1,0], [1,-4,1], [0,1,0]]) find_contours(kernel1) find_contours(kernel2) find_contours(kernel3) find_contours(kernel4) find_contours(kernel5) find_contours(kernel6)

在这里插入图片描述

色彩空间 函数 功能 cv2.cvtColor(,cv2.COLOR_BGR2GRAY) 图像灰度化 cv2.cvtColor(,cv2.COLOR_BGR2HSV) RGB转HSV """色彩空间""" import cv2 img = cv2.imread('bai.png') img = cv2.resize(img,(400,300)) img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img2 = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.waitKey(0) cv2.destroyAllWindows()

在这里插入图片描述

形状绘制 函数 功能 cv2.line( ) 绘制直线 cv2.circle( ) 绘制圆圈 cv2.ellipse( ) 绘制椭圆 cv2.rectangle( ) 绘制矩形 cv2.arrowedLine( ) 绘制箭头 cv2.putText( ) 绘制文本 """形状绘制""" import cv2 img = cv2.imread('bai.png') img = cv2.resize(img,(400,300)) imgx = img.copy() imgy = img.copy() imgz = img.copy() imgw = img.copy() img = cv2.resize(img,(400,300)) img1 = cv2.line(img,(10,10),(200,300),(0,0,255),2) img2 = cv2.circle(imgx,(60,60),30,(0,0,213),-1) img3 = cv2.rectangle(imgy,(10,10),(100,80),(0,0,200),2) img4 = cv2.ellipse(imgz,(256,256),(50,40),0,5,360,(20,213,79),-1) font=cv2.FONT_HERSHEY_SIMPLEX img5 = cv2.putText(imgw,'opencv',(80,90), font, 2,(255,255,255),3) cv2.imshow('img1',img1) cv2.imshow('img2',img2) cv2.imshow('img3',img3) cv2.imshow('img4',img4) cv2.imshow('img5',img5) cv2.waitKey(0) cv2.destroyAllWindows()

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

写在最后

在这里插入T图片描述 资料包 下一期将扒拉sklearn库,该库是做机器学习的不二之选,欢迎大家搬好小板凳呀!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3