社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

别不信,100行代码,带你玩转OpenCV-Python基础API

OpenCV学堂 • 2 月前 • 77 次点击  

点击上方↑↑↑OpenCV学堂”关注我

OpenCV-Python开发极简入门教....

做计算机视觉无论如何都绕不开的一个框架就是OpenCV,可以毫不夸张的说,github上每个开源的视觉项目的安装列表中都有OpenCV框架。很多人第一次接触OpenCV都是从OpenCV-Python版本SDK开始的,本文就以最新版本的OpenCV4.1.0为例,通过代码带领大家简单粗暴的入门OpenCV-Python编程实践。


安装OpenCV-Python

只需要执行如下一条命令行即可

pip install opencv-python


如果想连扩展模块一起安装,执行如下命令行

pip install opencv-contrib-python


更多请参考这里

https://pypi.org/project/opencv-python/


代码演示部分

涵盖OpenCV图像处理最高频次使用API与常见各种使用技巧。


导入CV模块

import cv2 as cv
import numpy as np


解释:这个是因为OpenCV在python语言中的所有图像数据都是以numpy的数组形式组织存储。所以必须安装numpy依赖支持,导入以备后用。

加载与现实图像

src = cv.imread("D:/images/lena.jpg")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

解释:千万别给中文路径,不支持的,默认加载图像彩色,通道顺序BGR


转换为灰度

gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
print(src.shape)
print(gray.shape)

解释:支持各种色彩空间转换,可以转换到灰度,HSV、YCrCb、LAB等常见色彩空间,图像的宽、高、通道数,可以通过src.shape得到。


创建空白图像

black = np.zeros_like(src)
cv.imshow("black", black)

解释:创建一张与src大小与数据类型一致的图像,但是像素值全部为0,黑色背景图像。


调节亮度

black[:,:,:] = 50
lighter = cv.add(src, black)
darker = cv.subtract(src, black)
cv.imshow("lightness", lighter)
cv.imshow("darkness", darker)

解释:过像素操作实现图像亮度调整,本质是调整图像的RGB值


调节对比度

dst = cv.addWeighted(src, 1.2, black, 0.0, 0)
cv.imshow("contrast", dst)

解释:通过权重的图像相加实现图像对比度调整,这里要特别注意,两幅图像的大小与数据类型必须完全一致。


放大/缩小 图像

# scale
h, w, c = src.shape
dst = cv.resize(src, (h//2, w//2))
cv.imshow("resize-image", dst)

解释:图像放缩支持常见的插值方式,最近邻,线性,双立方等


翻转




    
# 左右翻转
dst = cv.flip(src, 1)
cv.imshow("flip", dst)

# 上下翻转
dst = cv.flip(src, 0)
cv.imshow("flip0", dst)

解释:图像的镜像翻转支持,水平与垂直


旋转

M = cv.getRotationMatrix2D((w//2, h//2),45, 1)
dst = cv.warpAffine(src, M, (w, h))
cv.imshow("rotate", dst)

解释:图像的旋转支持,基于放射变换,M = 2x3的变换矩阵


色彩变换

# HSV
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
cv.imshow("hsv", hsv)

# 色彩表 - 支持14种色彩变换
dst = cv.applyColorMap(src, cv.COLORMAP_AUTUMN)
cv.imshow("color table", dst)

解释:支持图像常见的14种查找表色彩匹配与风格变化,是自带的14种色彩滤镜


模糊

blur = cv.blur(src, (15, 15))
cv.imshow("blur", blur)

解释:图像卷积模糊操作,卷积核大小为15x15


高斯模糊

gblur = cv.GaussianBlur(src, (0, 0), 15)
cv.imshow("gaussian blur", gblur)

解释:图像高斯模糊操作,sigma = 15


自定义滤波器

k = np.ones(shape=[5, 5], dtype=np.float32) / 25
dst = cv.filter2D(src, -1, k)
cv.imshow("custom blur", dst)

解释:图像自定义滤波操作,定义不同的滤波器,得到不同的滤波效果,这里是均值滤波,模糊操作。


高斯双边滤波

dst = cv.bilateralFilter(src, 0, 100, 10)
cv.imshow("bi-filter", dst)

解释:边缘保留滤波算法的一种,OpenCV还支持其它的边缘保留滤波算法。


图像梯度

dx = cv.Sobel(src, cv.CV_32F, 1, 0)
dy = cv.Sobel(src, cv.CV_32F, 0, 1)
dx = cv.convertScaleAbs(dx)
dy = cv.convertScaleAbs(dy)
cv.imshow("grad-x", dx)
cv.imshow("grad-y", dy)

解释:图像梯度提取,基于一阶导数算子Sobel


边缘检测

edge = cv.Canny(src, 100, 300)
cv.imshow("edge", edge)

解释:图像边缘提取,Canny是经典的图像边缘提取算法。100表示低阈值,300表示高阈值。


直方图均衡化

eh = cv.equalizeHist(gray)
cv.imshow("eh", eh)

解释:图像直方图均衡化,是图像直方图应用之一,其它还有直方图匹配,直方图相似度,直方图反向投影等。这里的均衡化是全局均衡化,对应还有局部自适应的直方图均衡化方法。


角点检测

corners = cv.goodFeaturesToTrack(gray, 100, 0.05, 10)
# print(len(corners))
for pt in corners:
   # print(pt)
   b = np.random.random_integers(0, 256)
   g = np.random.random_integers(0, 256)
   r = np.random.random_integers(0, 256)
   x = np.int32(pt[0][0])
   y = np.int32(pt[0][1])
   cv.circle(src, (x, y), 5, (int(b), int(g), int(r)), 2)
cv.imshow("corners detection", src)

解释:基于shi-tomas角点检测算法


二值化加载图像

src = cv.imread("D:/images/zsxq/zsxq_12.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("binary input", gray)

解释:加载二值化操作测试图像


固定阈值

ret, binary = cv.threshold(gray, 127255, cv.THRESH_BINARY)
cv.imshow("binary"binary)

解释:手动指定阈值为127,THRESH_BINARY表示大于127为白色,反之为黑色。


全局阈值

ret, binary = cv.threshold(gray, 0255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("otsu"binary)

解释:自动计算阈值,基于全局直方图信息


自适应阈值

binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 25, 10)
cv.imshow("ada", binary)

解释:自适应阈值计算方法,支持高斯与盒子两种方式。


轮廓分析

contours, hireachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
result = np.zeros_like(src)
for cnt in range(len(contours)):
   cv.drawContours(result, contours, cnt, (00255), 28)
cv.imshow("contour", result)

解释:二值图像的轮廓与结构分析API,演示,这里只是获取了最外层轮廓。


膨胀与腐蚀操作

se = cv.getStructuringElement(cv.MORPH_RECT, (5, 5), (-1, -1))
d = cv.dilate(binary, se)
e = cv.erode(binary, se)
cv.imshow("dilate", d)
cv.imshow("erode", e)

解释:二值图像的形态学基础操作,腐蚀与膨胀


开闭操作

op = cv.morphologyEx(binary, cv.MORPH_OPEN, se)
cl = cv.morphologyEx(binary, cv.MORPH_CLOSE, se)
cv.imshow("open", op)
cv.imshow("close", cl)

解释:二值图像的形态学组合操作,开操作与闭操作

上述全部演示代码的代码下地址:

https://github.com/gloomyfish1998/opencv_tutorial



志合者不以山海为远

道乖者不以咫尺为近


OpenCV4系统化学习


深度学习系统化学习

推荐阅读

OpenCV4.8+YOLOv8对象检测C++推理演示

ZXING+OpenCV打造开源条码检测应用

攻略 | 学习深度学习只需要三个月的好方法

三行代码实现 TensorRT8.6 C++ 深度学习模型部署

实战 | YOLOv8+OpenCV 实现DM码定位检测与解析

对象检测边界框损失 – 从IOU到ProbIOU

初学者必看 | 学习深度学习的五个误区



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/171702
 
77 次点击