opencv-python的简单练习

一、编程题

读取一张彩色图像并将其转换为灰度图。

import cv2

# 读取彩色图像
image_path = 'path_to_your_image.jpg'  # 替换为你的图像路径
color_image = cv2.imread(image_path)

# 检查图像是否成功加载
if color_image is None:
    print("图像加载失败,请检查图像路径")
else:
    # 将彩色图像转换为灰度图
    gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

    # 显示彩色图像和灰度图
    cv2.imshow('Color Image', color_image)
    cv2.imshow('Gray Image', gray_image)

    # 等待按键按下然后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    # 保存灰度图像(可选)
    gray_image_path = 'gray_image.jpg'  # 替换为你想保存的灰度图像路径
    cv2.imwrite(gray_image_path, gray_image)
    print(f"灰度图像已保存至 {gray_image_path}")

二、编程题

题目1:二值化与形态学操作‌

编写程序,读取一张彩色图像【flower.png】,将其转换为灰度图,然后进行二值化处理。

接着,对二值化后的图像执行腐蚀和膨胀操作,并显示处理前后的图像。

import cv2
import numpy as np

# 读取彩色图像
image_path = 'flower.png'
color_image = cv2.imread(image_path)

# 转换为灰度图
gray_image = cv2.cvtColor(color_image, cv2.COLOR_BGR2GRAY)

# 二值化处理
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 定义核(结构元素)
kernel = np.ones((3, 3), np.uint8)

# 腐蚀操作
eroded_image = cv2.erode(binary_image, kernel, iterations=1)

# 膨胀操作
dilated_image = cv2.dilate(eroded_image, kernel, iterations=1)

# 显示处理前后的图像
cv2.imshow('Original Image', color_image)
cv2.imshow('Binary Image', binary_image)
cv2.imshow('Eroded Image', eroded_image)
cv2.imshow('Dilated Image', dilated_image)

cv2.waitKey(0)
cv2.destroyAllWindows()

题目2:图像变换与颜色识别‌

编写程序,读取一张彩色图像,执行以下操作:

  1. 将图像缩放至指定大小(例如,宽度和高度都缩小为原来的一半)。
  2. 对缩放后的图像应用仿射变换,实现图像的旋转(例如,旋转45度)。
  3. 将图像从BGR颜色空间转换为HSV颜色空间,并提取出特定的颜色范围(例如,提取黄色区域)。
  4. 显示处理后的图像,并在图像上标记出识别到的颜色区域。
import cv2
import numpy as np

# 读取彩色图像
image_path = 'your_image.jpg'  # 替换为你的图像路径
color_image = cv2.imread(image_path)

# 1. 缩放图像
scaled_image = cv2.resize(color_image, (0, 0), fx=0.5, fy=0.5)

# 2. 仿射变换(旋转45度)
rows, cols, _ = scaled_image.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
rotated_image = cv2.warpAffine(scaled_image, M, (cols, rows))

# 3. 转换为HSV颜色空间
hsv_image = cv2.cvtColor(rotated_image, cv2.COLOR_BGR2HSV)

# 定义黄色的HSV范围
lower_yellow = np.array([20, 100, 100], dtype=np.uint8)
upper_yellow = np.array([30, 255, 255], dtype=np.uint8)

# 4. 提取黄色区域
mask = cv2.inRange(hsv_image, lower_yellow, upper_yellow)
result = cv2.bitwise_and(rotated_image, rotated_image, mask=mask)

# 显示处理后的图像
cv2.imshow('Original Image', color_image)
cv2.imshow('Rotated Image', rotated_image)
cv2.imshow('Yellow Mask', mask)
cv2.imshow('Extracted Yellow', result)

cv2.waitKey(0)
cv2.destroyAllWindows()

题目3:图像矫正

编写程序,读取一张彩色图像,执行以下操作

  1. 找到原图 和目标图的四个点,获取透视变换矩阵
  2. 对图像应用透视变换,实现油画区域的矫正
    import cv2
    import numpy as np
    
    # 读取彩色图像
    image_path = 'your_image_with_painting.jpg'  # 替换为你的图像路径
    color_image = cv2.imread(image_path)
    
    # 定义原图和目标图的四个点
    # 这些点需要根据你的实际图像进行手动选择
    src_points = np.float32([[100, 100], [200, 100], [100, 200], [200, 200]])
    dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
    
    # 1. 获取透视变换矩阵
    M = cv2.getPerspectiveTransform(src_points, dst_points)
    
    # 2. 应用透视变换
    height, width = dst_points[2][1], dst_points[1][0]
    warped_image = cv2.warpPerspective(color_image, M, (width, height))
    
    # 显示处理后的图像
    cv2.imshow('Original Image', color_image)
    cv2.imshow('Warped Image', warped_image)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    四、编程题(共10分)‌

    请编写一段Python代码,使用OpenCV库对一张图像进行以下处理:

  3. 将图像转换为灰度图。
  4. 使用高斯滤波器平滑图像,内核大小为5x5,标准差为1。
  5. 使用Canny边缘检测算法检测图像边缘,阈值1为50,阈值2为150。
  6. 在检测到的边缘图像上绘制轮廓,轮廓颜色为红色,厚度为2。
    import cv2
    import numpy as np
    
    # 读取图像
    image_path = 'your_image.jpg'  # 替换为你的图像路径
    image = cv2.imread(image_path)
    
    # 1. 将图像转换为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 2. 使用高斯滤波器平滑图像,内核大小为5x5,标准差为1
    blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 1)
    
    # 3. 使用Canny边缘检测算法检测图像边缘,阈值1为50,阈值2为150
    edges = cv2.Canny(blurred_image, 50, 150)
    
    # 4. 在检测到的边缘图像上绘制轮廓,轮廓颜色为红色,厚度为2
    # 为了在原始图像上绘制轮廓,我们需要先找到边缘的轮廓
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建一个用于绘制轮廓的图像副本
    image_with_contours = image.copy()
    
    # 绘制轮廓
    cv2.drawContours(image_with_contours, contours, -1, (0, 0, 255), 2)
    
    # 显示处理后的图像
    cv2.imshow('Original Image', image)
    cv2.imshow('Gray Image', gray_image)
    cv2.imshow('Blurred Image', blurred_image)
    cv2.imshow('Edges Detected', edges)
    cv2.imshow('Image with Contours', image_with_contours)
    
    # 等待按键并关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    交通信号灯识别‌:

    你正在开发一个自动驾驶系统,需要识别交通信号灯的颜色(红、黄、绿)。请设计一个简化的流程,说明如何使用OpenCV来识别交通信号灯的颜色。

    思路分析‌:

  7. 读取包含交通信号灯的图像。
  8. 转换图像到HSV颜色空间。
  9. 分别为红、黄、绿三种颜色定义HSV范围,并创建三个掩膜。
  10. 对每个掩膜进行轮廓检测,识别出可能的信号灯区域。
    import cv2
    # 读取图像
    image = cv2.imread('demo111.png')
    
    # 转换图像到HSV颜色空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # 定义HSV范围
    red_lower = (0, 100, 100)
    red_upper = (10, 255, 255)
    yellow_lower = (15, 100, 100)
    yellow_upper = (30, 255, 255)
    green_lower = (40, 40, 40)
    green_upper = (90, 255, 255)
    
    # 创建掩膜
    mask_red = cv2.inRange(hsv, red_lower, red_upper)
    mask_yellow = cv2.inRange(hsv, yellow_lower, yellow_upper)
    mask_green = cv2.inRange(hsv, green_lower, green_upper)
    
    # 轮廓检测函数
    def detect_contours(mask, color):
        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        for contour in contours:
            if cv2.contourArea(contour) > 100:
                x, y, w, h = cv2.boundingRect(contour)
                cv2.rectangle(image, (x, y), (x+w, y+h), color, 2)
    
    # 对每个掩膜进行轮廓检测
    detect_contours(mask_red, (0, 0, 255))  # 红色用红色框
    detect_contours(mask_yellow, (0, 255, 255))  # 黄色用黄色框
    detect_contours(mask_green, (0, 255, 0))  # 绿色用绿色框
    
    # 显示结果
    cv2.imshow('Detected Traffic Lights', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    产品质量检测‌:

    在一家生产彩色玩具的工厂中,需要检测产品是否按照正确的颜色进行生产。请设计一个使用OpenCV的自动化检测系统,该系统能够识别并报告不符合颜色标准的产品。

    ‌思路分析‌:

  11. 设定产品的标准颜色范围(HSV值)。
  12. 使用摄像头或图像文件获取待检测产品的图像。
  13. 转换图像到HSV颜色空间。
  14. 为每种标准颜色创建掩膜,并与产品图像进行比对。
  15. 识别出颜色不符合标准的产品,并记录或报告。
  16. import cv2
    import numpy as np
    
    # 设定黄色HSV范围
    yellow_lower = (15, 100, 100)
    yellow_upper = (30, 255, 255)
    
    # 读取待检测产品的图像
    image = cv2.imread('duck.png')
    
    # 转换图像到HSV颜色空间
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # 创建黄色掩膜
    mask_yellow = cv2.inRange(hsv, yellow_lower, yellow_upper)
    
    # 使用轮廓检测找到掩膜中的所有轮廓
    contours, _ = cv2.findContours(mask_yellow, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 设定面积阈值
    min_area = 500  # 根据实际情况调整
    
    # 遍历所有轮廓,剔除面积过小的轮廓
    filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) >= min_area]
    
    # 检查是否有符合面积要求的黄色区域
    if filtered_contours:
        print("Detected yellow duck toy with sufficient area.")
    else:
        print("No yellow duck toy detected or yellow area is too small.")
    
    # 可选:绘制轮廓和显示结果
    cv2.drawContours(image, filtered_contours, -1, (0, 255, 0), 3)
    cv2.imshow('Original Image with Contours', image)
    cv2.imshow('Yellow Mask', mask_yellow)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    图像预处理与特征提取‌

  17. 将图像转换为灰度图
  18. 对灰度图进行二值化处理
  19. 使用形态学变换去除噪声【开运算】
  20. 检测图像中的边缘
  21. 查找并绘制图像中的轮廓
  22. 逐一遍历轮廓,输出所有四边形的周长 和 面积。
    import cv2
    import numpy as np
    
    # 读取图像
    image = cv2.imread('path_to_your_image.jpg')
    
    # 1. 将图像转换为灰度图
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 2. 对灰度图进行二值化处理
    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    
    # 3. 使用形态学变换去除噪声【开运算】
    kernel = np.ones((5, 5), np.uint8)
    opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
    
    # 4. 检测图像中的边缘
    edges = cv2.Canny(opened, 50, 150)
    
    # 5. 查找并绘制图像中的轮廓
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 创建一个用于绘制轮廓的图像副本
    image_contours = image.copy()
    cv2.drawContours(image_contours, contours, -1, (0, 255, 0), 2)
    
    # 6. 逐一遍历轮廓,输出所有四边形的周长和面积
    for contour in contours:
        # 计算轮廓的周长
        perimeter = cv2.arcLength(contour, True)
        # 使用多边形逼近来获取近似的四边形轮廓
        approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
        
        # 仅处理四边形
        if len(approx) == 4:
            # 计算面积
            area = cv2.contourArea(approx)
            print(f'四边形周长: {perimeter:.2f}, 面积: {area:.2f}')
            
            # 绘制四边形轮廓
            cv2.drawContours(image_contours, [approx], -1, (255, 0, 0), 2)
    
    # 显示处理结果
    cv2.imshow('Gray Image', gray)
    cv2.imshow('Binary Image', binary)
    cv2.imshow('Opened Image', opened)
    cv2.imshow('Edges Image', edges)
    cv2.imshow('Contours Image', image_contours)
    
    # 等待按键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    车牌识别预处理‌

    假设你正在开发一个车牌识别系统,首先需要从图像中识别出车牌区域。请描述并编写代码实现以下步骤:

  23. 读取一张包含车牌的图像。
  24. 将图像转换为灰度图以简化处理。
  25. 使用高斯滤波器平滑图像,减少噪声干扰。
  26. 应用Canny边缘检测算法检测图像中的边缘。
  27. 查找图像中的轮廓。
  28. 逐一遍历轮廓。
  29. 设定一个面积双阈值,只保留面积在该阈值的轮廓。
  30. 计算这些轮廓的长宽比,长宽比ratio在2到5.5之间的,在原图上用矩形框标出,这些轮廓可能是车牌的候选区域。
    import cv2
    import numpy as np
    
    # 1. 读取包含车牌的图像
    image_path = 'path_to_your_car_image.jpg'  # 请替换为你的图像文件路径
    image = cv2.imread(image_path)
    
    # 2. 将图像转换为灰度图
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 3. 使用高斯滤波器平滑图像
    blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
    
    # 4. 应用Canny边缘检测算法
    edges = cv2.Canny(blurred_image, 50, 150)
    
    # 5. 查找图像中的轮廓
    contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # 设定面积双阈值
    min_area = 1000  # 最小面积阈值,根据实际情况调整
    max_area = 15000  # 最大面积阈值,根据实际情况调整
    
    # 6. 逐一遍历轮廓
    for contour in contours:
        # 7. 只保留面积在阈值范围内的轮廓
        area = cv2.contourArea(contour)
        if min_area < area < max_area:
            # 获取轮廓的外接矩形
            x, y, w, h = cv2.boundingRect(contour)
            
            # 8. 计算长宽比,并筛选出可能的车牌候选区域
            ratio = w / h
            if 2 < ratio < 5.5:
                # 在原图上绘制矩形框
                cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
    # 显示处理后的图像
    cv2.imshow('Car Image with Possible License Plate Regions', image)
    
    # 等待按键并关闭窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

【USB-HID】“自动化键盘“ - 模拟键盘输入

目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现&#xff0c;网…

图-遍历(DFS+BFS)

图-遍历 1.简介2.深度优先遍历dfs3.广度优先遍历bfs4.具体问题4.1 岛屿的最大面积4.2 岛屿的数量 5.总结 1.简介 图是数据结构中的另一种数据结构&#xff0c;通常用来表示多对多的关系。在 C 中&#xff0c;图通常可以通过邻接表或邻接矩阵表示。 例如&#xff1a; 2.深度优…

python中向量指的是什么意思

一、向量是什么 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&am…

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…

[OpenGL] Transform feedback 介绍以及使用示例

一、简介 本文介绍了 OpenGL 中 Transform Feedback 方法的基本概念和代码示例。 二、Transform Feedback 介绍 1. Transform Feedback 简介 根据 OpenGL-wiki&#xff0c;Transform Feedback 是捕获由顶点处理步骤&#xff08;vertex shader 和 geometry shader&#xff0…

探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)

一、Coze 智能体概述 &#xff08;一&#xff09;Coze 智能体是什么 Coze 智能体是基于机器学习和自然语言处理技术的软件实体&#xff0c;它在人工智能领域扮演着重要的角色&#xff0c;能够像一个智能助手一样&#xff0c;通过与外界环境进行交互学习&#xff0c;进而执行各…

游戏引擎学习第47天

仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题&#xff0c;但基本上是在修复这个问题的过程中&#xff0c;我们决定添加一个功能&#xff0c;那就是在屏幕上控制多个实体。所以如果我有一个手柄&#xff0c;我可以添加另一个角色&#xff0…

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收&#xff0c;我也是在写项目的时候边学边写&#xff0c;有不足的地方希望在评论区留下你的建议&#xff0c;我们一起讨论学习呀~ 需求背景 先说一下我的项目需求背景&#xff0c;社区之间可以进行物资借用&#xff0c…

计算机进制的介绍

一.进制介绍 对于整数&#xff0c;有四种表示方式: 1&#xff09;二进制:0,1&#xff0c;满2进1。 在golang中&#xff0c;不能直接使用二进制来表示一个整数&#xff0c;它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一&#xff1a;确认应答 TCP的序号和确认序号 核心机制二&#xff1a;丢包重传 核心机制三&#xff1a;连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四&#xff1a;滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

【经验分享】容器云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?

鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似&#xff0c;但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统&#xff0c;强调多设备协同和资源共享&#xff0c;而Android则主要集中在智能手机和移动设备领域。 下面将从…

新手快速入门!低功耗4G模组Air780E——使用文件系统存储温湿度数据来啦~

小伙伴们&#xff0c;今天我们来学习低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据。一起接着看下去吧&#xff01; 一、编写脚本 1.1 准备资料 780E开发板 780E开发板设计资料 LuatOS-Air780E-文件系统的使用-程序源码demo TCP/UDP测试服务器 API使用介绍 …

vscode中插件ofExtensions的debug模式也无法查看U、p等openfoam中foam类型的变量

插件介绍&#xff1a; 主要内容如下&#xff1a; 以自编译的$HOME/OpenFOAM-7例&#xff0c;如果OFdebugopt设置为WM_COMPILE_OPTIONDebug&#xff0c;那最终的激活环境的命令为source $HOME/OpenFOAM/OpenFOAM-8/etc/bashrc WM_COMPILE_OPTIONDebug&#xff0c;这时候$FOAM_…

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

【经验分享】私有云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…