opencv-python的简单练习

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

python 复制代码
import cv2

img = cv2.imread('./456.png')
img_gray = cv2.imread('./456.png',cv2.IMREAD_GRAYSCALE)

cv2.imshow('image',img)
cv2.imshow('gray',img_gray)
cv2.waitKey(0)

2.编写程序,读取一张彩色图像【flower.png】,将其转换为灰度图,然后进行二值化处理。接着,对二值化后的图像执行腐蚀和膨胀操作,并显示处理前后的图像

python 复制代码
import cv2

img_gray = cv2.imread('./789.png', cv2.IMREAD_GRAYSCALE)
img_binary = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 9, 5)

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
img_erode = cv2.erode(img_binary, kernel)
img_erode_dilate = cv2.dilate(img_erode, kernel)

cv2.imshow('binary', img_binary)
cv2.imshow('erode', img_erode)
cv2.imshow('dilate', img_erode_dilate)
cv2.waitKey(0)

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

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

img = cv2.imread('./123.jpg')
img_resize = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
M = cv2.getRotationMatrix2D((img_resize.shape[1]/2, img_resize.shape[0]/2), 45, 1)
img_warp = cv2.warpAffine(img_resize, M, (img_resize.shape[1], img_resize.shape[0]))
img_hsv = cv2.cvtColor(img_warp, cv2.COLOR_BGR2HSV)
hsv_min = np.array([26,43,46])
hsv_max = np.array([34,255,255])
mask = cv2.inRange(img_hsv, hsv_min, hsv_max)
img_mask_color = cv2.bitwise_and(img_warp, img_warp, mask=mask)

cv2.imshow('img', img)
cv2.imshow('img_resize', img_resize)
cv2.imshow('img_warp', img_warp)
cv2.imshow('img_mask_color', img_mask_color)
cv2.waitKey(0)

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

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

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

# 定义源图像中的四个角点
points1 = np.float32([
    [174,143],
    [623,37],
    [90,492],
    [656,550]
])

# 根据源图像角点的最小和最大坐标值,定义目标图像中的四个角点
# 这样做是为了将源图像的角点区域变换到目标图像的对应位置
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)

# 应用透视变换到图像上
dst = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0]))

# 获取油画部分的边界坐标
min_x, min_y = points2.min(axis=0).astype(int)
max_x, max_y = points2.max(axis=0).astype(int)

# 裁剪图像以去除油画以外的空间
cropped_dst = dst[min_y:max_y, min_x:max_x]

# 显示原图
cv2.imshow('img', img)

# 显示裁剪后的图像
cv2.imshow('cropped_dst', cropped_dst)

cv2.waitKey(0)

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

  1. 将图像转换为灰度图。
  2. 使用高斯滤波器平滑图像,内核大小为5x5,标准差为1。
  3. 使用Canny边缘检测算法检测图像边缘,阈值1为50,阈值2为150。
  4. 在检测到的边缘图像上绘制轮廓,轮廓颜色为红色,厚度为2。
python 复制代码
import cv2
 
# 读取图片文件
img = cv2.imread("./picture.png")
 
# 调整图片大小,便于处理和显示
img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
 
# 将图片转换为灰度图,便于后续的二值化处理
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
# 使用Otsu's thresholding方法对灰度图进行二值化处理
ret,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
 
# 对二值化的图片进行高斯模糊处理,减少噪声
img_blur = cv2.GaussianBlur(img_binary,(5,5),1)
 
# 使用Canny算法对模糊处理后的图片进行边缘检测
img_canny = cv2.Canny(img_blur,50,150)
 
# 找到边缘检测后的图片中的轮廓
contours, _ = cv2.findContours(img_canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
 
# 复制原图
img_copy = img.copy()
# 在复制的图片上绘制找到的轮廓
img_draw = cv2.drawContours(img_copy,contours,-1,(0,0,255),2)
 
# 显示二值化后的图片
cv2.imshow("img_binary",img_binary)
# 显示经过高斯模糊处理后的图片
cv2.imshow("img_blur",img_blur)
# 显示边缘检测后的图片
cv2.imshow("img_canny",img_canny)
# 显示绘制了轮廓的图片
cv2.imshow("img_draw",img_draw)
 
# 等待用户按键,任意键按下后关闭所有图片窗口
cv2.waitKey(0)

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

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

img = cv2.imread('./demo111.png')

img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

hsv_y_min = np.array([26,43,46])
hsv_y_max = np.array([34,255,255])

hsv_g_min = np.array([35,43,46])
hsv_g_max = np.array([77,255,255])

hsv_r_min1 = np.array([0,43,46])
hsv_r_max1 = np.array([10,255,255])
hsv_r_min2 = np.array([156,43,46])
hsv_r_max2 = np.array([180,255,255])

mask_y = cv2.inRange(img_hsv,hsv_y_min,hsv_y_max)
mask_g = cv2.inRange(img_hsv,hsv_g_min,hsv_g_max)
mask_r1 = cv2.inRange(img_hsv,hsv_r_min1,hsv_r_max1)
mask_r2 = cv2.inRange(img_hsv,hsv_r_min2,hsv_r_max2)
mask_r = cv2.bitwise_or(mask_r1,mask_r2)
mask_yg = cv2.bitwise_or(mask_y,mask_g)
mask_all = cv2.bitwise_or(mask_yg,mask_r)

mask_all_color = cv2.bitwise_and(img,img,mask=mask_all)

img_blur = cv2.GaussianBlur(mask_all_color,(5,5),0)

img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)

_,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

contours,_ = cv2.findContours(img_binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

img_copy = img.copy()

for cnt in contours:
    if cv2.contourArea(cnt) < 2000:
        continue
    (x,y),radius = cv2.minEnclosingCircle(cnt)
    (x,y),radius = np.int32((x,y)),np.int32(radius)
    cv2.circle(img_copy,(x,y),radius,(255,255,0),2)

cv2.imshow('img_copy',img_copy)
cv2.waitKey(0)

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

  1. 设定产品的标准颜色范围(HSV值)。
  2. 使用摄像头或图像文件获取待检测产品的图像。
  3. 转换图像到HSV颜色空间。
  4. 为每种标准颜色创建掩膜,并与产品图像进行比对。
  5. 识别出颜色不符合标准的产品,并记录或报告。
python 复制代码
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, 'not', (cX, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)

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

8.图像预处理与特征提取‌

  1. 将图像转换为灰度图
  2. 对灰度图进行二值化处理
  3. 使用形态学变换去除噪声【开运算】
  4. 检测图像中的边缘
  5. 查找并绘制图像中的轮廓
  6. 逐一遍历轮廓,输出所有四边形的周长 和 面积。
python 复制代码
import cv2

img = cv2.imread('./02.png')

img_blur = cv2.GaussianBlur(img,(3,3),1)

img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)

_,img_binary = cv2.threshold(img_gray,128,255,cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

contours,_ = cv2.findContours(img_binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

img_copy = img.copy()

def put_text(img1,shape1,x1,y1):
    if shape1 == 'triangle':
        cv2.putText(img1,'triangle',(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),1)
    elif shape1 == 'square':
        cv2.putText(img1,'square',(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)
    elif shape1 == 'pentagon':
        cv2.putText(img1,'pentagon',(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),1)
    elif shape1 == 'rectangle':
        cv2.putText(img1,'rectangle',(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)
    else:
        cv2.putText(img1,'circle',(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,255),1)


for cnt in contours:
    M = cv2.moments(cnt)
    if int(M['m00']) == 0:
        continue
    cx = int(M['m10']/M['m00'])
    cy = int(M['m01']/M['m00'])
    arc_len = cv2.arcLength(cnt,True)
    approx = cv2.approxPolyDP(cnt,0.02*arc_len,True)

    if len(approx) ==3:
        shape = 'triangle'
    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'

    put_text(img_copy, shape, cx, cy)
    img_draw = cv2.drawContours(img_copy,contours,-1,(255,255,0),2)


cv2.imshow('img',img_copy)
cv2.waitKey(0)
相关推荐
echo的PHP开发1 小时前
【python虚拟环境安装】linux centos 下的python虚拟环境配置
linux·python·centos·虚拟环境
♢.*1 小时前
自动驾驶2022-2024年论文汇总与解析
论文阅读·人工智能·计算机视觉·nlp·自动驾驶
lanboAI2 小时前
基于卷积神经网络的柠檬品质分级系统,resnet50,mobilenet模型【pytorch框架+python源码】
pytorch·python·cnn
zmd-zk3 小时前
spark读取hive和mysql的数据
大数据·hive·python·学习·mysql·spark
Z-xina3 小时前
Python面试常见问题及答案1
python
Murrays3 小时前
安装指定版本的python这里以3.11为例子
开发语言·python
德林恩宝3 小时前
焦距与视差的关系及其对深度估计的影响
人工智能·数码相机·计算机视觉
qq_411722584 小时前
【无标题】
python·django
梭七y4 小时前
【笔记】记录对python中.grad()的一些理解
开发语言·笔记·python
互联网杂货铺4 小时前
单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例