python opencv2

server/2024/11/28 15:22:47/

二、图像预处理

 1、图像翻转 

        cv2.flip(src, flipCode) :flipCode :0:沿 X 轴翻转(垂直翻转);1:沿 Y 轴翻转(水平翻转),-1:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)。

2、仿射变换

        一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。

img = cv2.imread("images/car2.png")

# 当前面 0 垂直翻转,1水平翻转,-1 水平锤子翻转
f0_img = cv2.flip(img, 0)
f1_img = cv2.flip(img, 1)
f2_img = cv2.flip(img, -1)
cv2.imshow("old", img)
cv2.imshow("new0", f0_img)
cv2.imshow("new1", f1_img)
cv2.imshow("new2", f2_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.1、图像旋转

        cv2.getRotationMatrix2D(center, angle, 1) ,设置旋转矩阵(参数1确定中心点,参数2为变化角度,参数3是图片缩放比例)

        cv2.warpAffine(image, M, (w, h)) ,设置图片使用特定方式进行旋转(参数2为旋转矩阵,参数3为图片尺寸)

        使用 (h, w) = image.shape[:2] 获取图片尺寸。

img = cv2.imread("images/car.png")
# 获取图片像素
(h, w) = img.shape[:2]
# 获取旋转的点
center = (100, 120)
# 获取度数
du = 30
# 获取图像矩阵 参数一为旋转中心点,参数二旋转度数,参数三为缩放比例
m = cv2.getRotationMatrix2D(center, du, 1)
# 图片旋转
w_img = cv2.warpAffine(img, m, (w, h))
cv2.imshow("img", img)
cv2.imshow("w_img", w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.2、图像平移

        np.float32([[1, 0, tx], [0, 1, ty]]) ;使用numpy库的float32创建一个平移矩阵。在使用 cv2.warpAffine 函数处理。

        将旋转矩阵参数变更平移矩阵。

img = cv2.imread("images/car.png")
# 获取图片像素
(h, w) = img.shape[:2]
# 获取旋转的点
center = (100, 120)
# 创建平移矩阵
tx, ty = 100, 50
# np.float32([[1, 0, tx], [0, 1, 0]])
# 参数为 [1, 0, tx] 分别表示 x轴保持原本比例,y轴不旋转(也就是原点和右下角点位于同一个x点位), tx 表示x移动位置
# 参数为 [0, 1, 0] 分别表示 x轴不旋转,y轴保持原本比列, ty 表示y移动位置
t = np.float32([[1, 0, tx], [0, 1, ty]])
# 图片旋转
w_img = cv2.warpAffine(img, t, (w, h))
cv2.imshow("img", img)
cv2.imshow("w_img", w_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.3、图像缩放

        与平移一致,变更参数。

# 参数为 [1, 0, tx] 分别表示 x轴保持原本比例,y轴不旋转(也就是原点和右下角点位于同一个x点位), tx 表示x移动位置
# 参数为 [0, 1, ty] 分别表示 x轴不旋转,y轴保持原本比列, ty 表示y移动位置np.float32([[1.5, 0, 1], [0, 1.5, 0]])

 2.4、图像变形

         与平移一致,变更参数。

# 参数为 [1, 0, tx] 分别表示 x轴保持原本比例,y轴不旋转(也就是原点和右下角点位于同一个x点位), tx 表示x移动位置
# 参数为 [0, 1, ty] 分别表示 x轴不旋转,y轴保持原本比列, ty 表示y移动位置np.float32([[1, 0.2, 1], [0.2, 1, 0]])

 3、图像色彩空间转换

        将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。

        cv2.cvtColor(src, code):code 为cv2下的指定名称,一般是为A2B,从A形式转移到B形式。

3.1、BGR 转 HSV

        code =  cv2.COLOR_BGR2HSV

img = cv2.imread("images/car.png")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow("img", img)
cv2.imshow("gav_img", hsv_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2、BGR 转 GRAY

        code =  cv2.COLOR_BGR2GRAY

img = cv2.imread("images/car.png")
gay_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("img", img)
cv2.imshow("gav_img", gay_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3、HSV、GRAY转BGR

        code =  cv2.COLOR_GRAY2BGR

        code =  cv2.COLOR_HSV2BGR

4、图像二值化处理

        通过阈值将图像分为两层(前景与背景).

        cv2.threshold(src, thresh, maxval, type) : thresh :设定阈值,决定分割界限;maxval:像素值超过阈值时,赋予的最大值(一般设置255);

type:阈值复制类型:

 cv2.THRESH_BINARY: 超过阈值的像素设为最大值,其余设为0

 cv2.THRESH_BINARY_INV: 超过阈值的像素设为0,其余设为最大值

 cv2.THRESH_TRUNC: 超过阈值的像素设为阈值,其余不变

 cv2.THRESH_TOZERO: 超过阈值的像素不变,其余设为0

 cv2.THRESH_TOZERO_INV: 超过阈值的像素设为0,其余不变

threshold 返回值:

          retval: 实际使用的阈值(可能与输入值不同)

          dst: 输出的二值图像

img = cv2.imread("images/car.png")
ret, dst = cv2.threshold(img, 196, 255, cv2.THRESH_BINARY)
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、图像掩模

         常用于从图像中提取特定颜色的区域

        cv2.inRange(src, lowerb, upperb):lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值;upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。

        一般使用HSV形式图像,返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域。

img = cv2.imread("images/car.png")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 确定蓝色区域
mask = cv2.inRange(hsv_img, np.array([100, 100, 100]), np.array([140, 255, 255]))
cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

6、图像检测轮廓

        contours, hierarchy = cv2.findContours(image, mode, method):image需要为二值图像;mode 为轮廓检索方式;method 为轮廓逼近方法。

mode:

cv2.RETR_EXTERNAL: 只检索外部轮廓

cv2.RETR_LIST: 检索所有轮廓,并将其放入列表中

cv2.RETR_TREE: 检索所有轮廓,并建立层级关系

method:

cv2.CHAIN_APPROX_SIMPLE: 压缩轮廓,仅保留端点

cv2.CHAIN_APPROX_NONE: 保留所有轮廓点

返回值

contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。

hierarchy: 轮廓的层级信息,包含轮廓之间的关系。

img = cv2.imread("images/car.png")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_img, np.array([100, 100, 100]), np.array([140, 255, 255]))
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    x, y, w, h = cv2.boundingRect(c)

    # 根据轮廓信息在原图片上画矩形
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

7、图像位与操作

        用于对两个图像进行按位与操作,像素均为255,则输出255,否则输出0。

        cv2.bitwise_and(src1, src2, mask=None),mask: 可选参数,用于指定一个掩模。

img = cv2.imread("images/car.png")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_img, np.array([100, 100, 100]), np.array([140, 255, 255]))
bst = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("img", img)
cv2.imshow("bst", bst)
cv2.waitKey(0)
cv2.destroyAllWindows()

8、文字识别

        import paddlehub as hub

        ocr = hub.Module(name="chinese_ocr_db_crnn_server")

        results = ocr.recognize_text(images=[img])

results 是一个列表与字典多层嵌套的结果。

img = cv2.imread("images/wenzi01.jpeg")
ocr = hub.Module(name="chinese_ocr_db_crnn_server")
results = ocr.recognize_text(images=[img])
print(results[0]['data'][0]['text']) # 遗憾的事情太多(识别一行)


http://www.ppmy.cn/server/137641.html

相关文章

车道区域分割车道线检测系统源码&数据集全套:改进yolo11-SEAMHead

改进yolo11-fasternet等200全套创新点大全:车道区域分割车道线检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.10.28 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系…

Spring Boot技术:构建高效能网上摄影工作室

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

OpenGL入门004——使用EBO绘制矩形

本节将利用EBO来绘制矩形 文章目录 一些概念EBO 实战简介utilswindowFactory.hRectangleModel.hRectangleModel.cpp main.cppCMakeLists.txt最终效果 一些概念 EBO 概述: Element Buffer Object 用于存储顶点的索引数据,以便在绘制图形时可以重用顶点数…

vscode在cmake config中不知道怎么选一个工具包?select a kit

vscode在cmake config中不知道怎么选一个工具包,或者发现一直在用VS的工具包想换成自己的工具包。select a kit vscode在cmake config中不知道怎么选一个工具包,或者发现一直在用VS的工具包想换成自己的工具包。select a kit 1.在VSCode中 按ctrlshift…

STM32开发 —— 新工程创建思路终于清晰了

目 录 工程创建三步法一、工程文件夹创建二、管理工程项三、配置工程参数 工程创建三步法 从ST官网下载好stm32标准库或HAL库,HAL库目录如下。 在Keil开发环境中创建STM32工程,分三大步即可完成工程的创建: 一步:在本地磁盘创建…

论文略读:AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

ACL 2024 在单一框架内整个多个模态 采用离散表示来统一处理文本、各种模态、图像和音乐

C语言中的main函数:命令行参数的工作原理

在C语言中,main函数是程序的入口点。它不仅可以接受返回值,还能处理命令行参数,允许用户在运行程序时传递数据。命令行参数是用户在启动程序时通过命令行界面提供的输入。C语言允许通过main函数的参数来访问这些输入。   int main(int argc…

私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?

私有化视频平台EasyCVR视频汇聚平台兼容性强、支持灵活拓展,平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 有用户反馈,项目现场使用RTMP协议接入EasyCVR平台,但是视频却不…