OpenCV实验篇

 一,

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

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

image = cv2.imread("./lena.png")

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imshow("image", image)
cv2.imshow("image_gray", image_gray)
cv2.waitKey(0)

 

二 ,

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

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

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

import cv2

image = cv2.imread("./flower.png")

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, image_binary = cv2.threshold(image_gray,
                                127,
                                255,
                                cv2.THRESH_BINARY+cv2.THRESH_OTSU
                                )

M = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))

image_erode = cv2.erode(image_binary, M)
image_dilate = cv2.dilate(image_erode, M)

cv2.imshow("image", image)
cv2.imshow("image_dilate", image_dilate)
cv2.waitKey(0)

 

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

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

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

image = cv2.imread("./threeColor.jpg")
image_resize = cv2.resize(image, dsize=None, fx = 0.5, fy= 0.5)
cv2.imshow("image_resize", image_resize)

M = cv2.getRotationMatrix2D((image.shape[0]/2, image.shape[1]/2), 45, 1)
image_warp = cv2.warpAffine(image,
                            M,
                            (image.shape[1], image.shape[0]),
                            flags=cv2.INTER_LINEAR,
                            borderMode=cv2.BORDER_TRANSPARENT)

cv2.imshow("image_warp", image_warp)

image_HSV = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
image_low = np.array([26, 43, 46])
image_high = np.array([34, 255, 255])

image_mark = cv2.inRange(image_HSV, image_low, image_high)
image_b = cv2.bitwise_and(image,image, mask = image_mark)
cv2.imshow("image_b", image_b)

cv2.waitKey(0)

 

‌题目3:图像矫正

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

  1. 1.找到原图 和目标图的四个点,获取透视变换矩阵
  2. 对图像应用透视变换,实现油画区域的矫正
import cv2
import numpy as np

# 加载图片
image = cv2.imread("./heman.png")

# 原始四个顶点坐标(需根据实际图像调整)
points1 = np.float32([[175, 142], [621, 35], [89, 491], [652, 546]])

# 定义目标矩形的四个点
points2 = np.float32([[min(points1[:, 0]), min(points1[:, 1])],
                      [max(points1[:, 0]), min(points1[:, 1])],
                      [min(points1[:, 0]), max(points1[:, 1])],
                      [max(points1[:, 0]), max(points1[:, 1])]])

# 计算透视变换矩阵
M = cv2.getPerspectiveTransform(points1, points2)

# 应用透视变换
image_per = cv2.warpPerspective(image, M, (image.shape[1], image.shape[0]))

# 裁剪出精确的矩形区域
image_per_new = image_per[int(points2[0][1]):int(points2[3][1]),
                          int(points2[0][0]):int(points2[3][0])]

# 显示原始图片与矫正结果
cv2.imshow("image", image)
cv2.imshow("image_per", image_per)
cv2.imshow("image_per_new", image_per_new)

cv2.waitKey(0)
cv2.destroyAllWindows()

三、

题目1:请编写一段Python代码,使用OpenCV库对一张图像进行以下处理:
  1. 将图像转换为灰度图。
  2. 使用高斯滤波器平滑图像,内核大小为5x5,标准差为1。
  3. 使用Canny边缘检测算法检测图像边缘,阈值1为50,阈值2为150。
  4. 在检测到的边缘图像上绘制轮廓,轮廓颜色为红色,厚度为2。
import cv2

image = cv2.imread("./logo.png")

image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

_, image_binary = cv2.threshold(image_gray,
                                127,
                                255,
                                cv2.THRESH_OTSU + cv2.THRESH_BINARY
                                )

image_blur = cv2.GaussianBlur(image_binary,
                              (3,3),
                              3
                              )

image_canny = cv2.Canny(image_blur,
                        30,
                        70
                        )

# cv2.imshow("image", image)
# cv2.imshow("image_gray", image_gray)
cv2.imshow("image_binary", image_binary)
cv2.imshow("image_blur", image_blur)
cv2.imshow("image_canny", image_canny)
cv2.waitKey(0)

四、

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

思路分析‌:

  1. 读取包含交通信号灯的图像。
  2. 转换图像到HSV颜色空间。
  3. 分别为红、黄、绿三种颜色定义HSV范围,并创建三个掩膜。
  4. 对每个掩膜进行轮廓检测,识别出可能的信号灯区域。

 

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

‌思路分析‌:

  1. 设定产品的标准颜色范围(HSV值)。
  2. 使用摄像头或图像文件获取待检测产品的图像。
  3. 转换图像到HSV颜色空间。
  4. 为每种标准颜色创建掩膜,并与产品图像进行比对。
  5. 识别出颜色不符合标准的产品,并记录或报告。
import cv2
import numpy as np

# 读取图像并调整大小
image = cv2.imread('./duck.png')  # 读取指定路径的图像
image = cv2.resize(image, (600, 600))  # 将图像调整为600x600像素

# 将BGR图像转换为HSV图像
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  # OpenCV默认读取图像为BGR格式,转换为HSV格式,便于颜色范围的筛选

# 定义橡皮鸭的标准颜色范围(HSV值)
# 每种颜色都包含了其对应的最小和最大HSV值范围,以及用于绘制矩形的颜色
colors = {
    'red': {'min': np.array([0, 100, 100]), 'max': np.array([10, 255, 255]), 'color': (0, 0, 255)},
    'blue': {'min': np.array([70, 50, 50]), 'max': np.array([130, 255, 255]), 'color': (255, 0, 0)},
    'green': {'min': np.array([50, 100, 100]), 'max': np.array([70, 255, 255]), 'color': (0, 255, 0)},
    'pink': {'min': np.array([140, 50, 50]), 'max': np.array([180, 255, 255]), 'color': (255, 0, 255)},
    'black': {'min': np.array([0, 0, 0]), 'max': np.array([180, 255, 46]), 'color': (0, 0, 0)},
}

# 遍历每种颜色,检测图像中的相应区域
for color_name, color_range in colors.items():
    # 使用inRange函数根据HSV值范围生成掩膜,提取出符合范围的颜色区域
    mask = cv2.inRange(hsv, color_range['min'], color_range['max'])

    # 使用findContours检测掩膜中的轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 遍历检测到的轮廓
    # 遍历所有轮廓,筛选出面积符合要求的轮廓并绘制
    for cnt in contours:
        if cv2.contourArea(cnt) < 600 or cv2.contourArea(cnt) > 20000000:
            continue
        M = cv2.moments(cnt)
        cX = int(M['m10'] / M['m00'])
        cY = int(M['m01'] / M['m00'])
        cv2.drawContours(image, [cnt], 0, (0, 0, 255), 2)
        cv2.putText(image, 'no', (cX, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color_range['color'], 2)

# 显示处理后的图像,包含标记出的颜色区域
cv2.imshow('image', image)
cv2.waitKey(0)  # 等待按键输入后关闭图像窗口

3.图像预处理与特征提取‌
  • 将图像转换为灰度图
  • 对灰度图进行二值化处理
  • 使用形态学变换去除噪声【开运算】
  • 检测图像中的边缘
  • 查找并绘制图像中的轮廓
  • 逐一遍历轮廓,输出所有四边形的周长 和 面积。
import cv2

# 1. 读取输入图像
image = cv2.imread("./02.png")  # 从指定路径加载图像文件

# 2. 对图像进行高斯模糊,平滑图像以减少噪声
image_blur = cv2.GaussianBlur(image, (3, 3), 1)

# 3. 将模糊后的图像转换为灰度图像
image_gray = cv2.cvtColor(image_blur, cv2.COLOR_BGR2GRAY)

# 4. 应用自适应阈值分割,生成二值图像
_, image_binary = cv2.threshold(
    image_gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU
)

# 5. 在二值图像中寻找轮廓
contours, _ = cv2.findContours(
    image_binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE
)

# 6. 创建图像副本用于绘制轮廓
image_copy = image.copy()

# 7. 遍历所有轮廓并分析轮廓的属性
for cnt in contours:
    # 7.1 计算轮廓的矩(质心、面积等信息)
    M = cv2.moments(cnt)
    if int(M["m00"]) == 0:
        continue  # 如果轮廓面积为 0,则跳过该轮廓

    # 7.2 计算轮廓的周长
    arc_len = cv2.arcLength(cnt, True)

    # 7.3 使用多边形逼近轮廓
    approx = cv2.approxPolyDP(cnt, float(0.04) * arc_len, True)

    # 7.4 判断逼近多边形的顶点数并分类形状
    if len(approx) == 3:
        shape = "triangle"  # 如果逼近的多边形有 3 个顶点,分类为三角形
    elif len(approx) == 4:
        x, y, w, h = cv2.boundingRect(approx)
        # 判断长宽比以区分正方形和矩形
        ratio = w / h
        if 0.95 <= ratio <= 1.05:
            shape = "square"
        else:
            shape = "rectangle"
    elif len(approx) == 5:
        shape = "pentagon"  # 五边形
    else:
        shape = "circle"  # 默认分类为圆形

    # 7.5 绘制轮廓和形状标签
    cv2.drawContours(image_copy, [cnt], -1, (0, 0, 255), 2)  # 红色轮廓线
    cX = int(M["m10"] / M["m00"])  # 计算质心 X 坐标
    cY = int(M["m01"] / M["m00"])  # 计算质心 Y 坐标
    cv2.putText(
        image_copy, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2
    )
    # 在质心处绘制形状名称,颜色为紫色,字体大小为 0.5,线条粗细为 2

# 8. 显示原始图像和处理后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Processed Image", image_copy)
cv2.waitKey(0)  # 等待按键关闭窗口
cv2.destroyAllWindows()

 

4.车牌识别预处理‌
假设你正在开发一个车牌识别系统,首先需要从图像中识别出车牌区域。请描述并编写代码实现以下步骤:
  • 读取一张包含车牌的图像。
  • 将图像转换为灰度图以简化处理。
  • 使用高斯滤波器平滑图像,减少噪声干扰。
  • 应用Canny边缘检测算法检测图像中的边缘。
  • 查找图像中的轮廓。
  • 逐一遍历轮廓。
  • 设定一个面积双阈值,只保留面积在该阈值的轮廓。
  • 计算这些轮廓的长宽比,长宽比ratio在2到5.5之间的,在原图上用矩形框标出,这些轮廓可能是车牌的候选区域。
import cv2

# 读取图片文件
img = cv2.imread('./c.png')

# 复制原图
img_copy = img.copy()

# 将图片转换为灰度图
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用高斯滤波器进行平滑处理
img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0)

# 应用Canny边缘检测算法检测图像中的边缘。
img_canny = cv2.Canny(img_gray, 50, 150)

# 找到轮廓
contours, hierarchy = cv2.findContours(img_canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 遍历所有轮廓
for i in contours:
    # 筛选轮廓面积在10000到15000之间的轮廓
    if 300 < cv2.contourArea(i) < 1500000:
        x, y, w, h = cv2.boundingRect(i)
        ratio = float(w) / h
        # 筛选长宽比在2到5.5之间的矩形
        if 2 < ratio < 5.5:
            # 画矩形
            cv2.rectangle(img_copy, cv2.boundingRect(i), (0, 255, 255), 5)

# 显示原图
cv2.imshow('img', img)
# 显示绘制了轮廓的图片
cv2.imshow('img_draw', img_copy)
# 等待按键按下
cv2.waitKey(0)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值