opencv-python的简单练习

news/2024/12/15 16:28:50/

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

python">import cv2
# 读取图片文件
img = cv2.imread('./1.png')# 将原图灰度化
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片
cv2.imshow('img',img)
cv2.imshow('img_g',img_gray)
# 进行阻塞
cv2.waitKey(0)

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

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

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

二值化图像

腐蚀图像

 

膨胀图像

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

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

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

python">import cv2
import numpy as npimg = cv2.imread('./2.png')
img = cv2.resize(img,dsize=None,fx=0.5,fy=0.5)# 获取放射变换矩阵
M =cv2.getRotationMatrix2D(center=(img.shape[1]/2,img.shape[0]/2), # 旋转的中心angle=45, # 旋转的角度scale=0.5) # 缩放 返回一个旋转矩阵img_ro = cv2.warpAffine(img,M,(img.shape[0],img.shape[1]),flags = cv2.INTER_LINEAR, # 插值的方式borderMode=cv2.BORDER_REFLECT_101) # 填充边缘的方式# 将原图转换成hsv
img_hsv = cv2.cvtColor(img_ro,cv2.COLOR_BGR2HSV)
# 制作掩膜
# 选取颜色 这里选择黄色
hsv_min = np.array([26,43,46],dtype=np.float32)
hsv_max = np.array([34,255,255],dtype=np.float32)
mask = cv2.inRange(img_hsv,hsv_min,hsv_max)# 将掩膜与原图进行与运算
img_color = cv2.bitwise_and(img_ro,img_ro,mask=mask)# 利用掩膜识别边缘
c,h =cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#用红线在原图标识
cv2.drawContours(img_ro,c,-1,(0,0,255),2)cv2.imshow('image',img_ro)
cv2.imshow('img_color',img_color)
cv2.waitKey(0)

‌题目4:图像矫正

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

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

python">import cv2
import numpy as np# 读取图像
img = cv2.imread('./youhua.png')
# 高斯滤波
img_blur = cv2.GaussianBlur(img,(3,3),1)# 灰度化
img_gray = cv2.cvtColor(img_blur,cv2.COLOR_BGR2GRAY)# 二值化
_,img_binary = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 寻找轮廓
contours,_ = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = sorted(contours,key=cv2.contourArea,reverse=True)[0]
img_copy = img.copy()img_copy = cv2.drawContours(img_copy,[cnt],-1,(0,0,255),2)# 找到card的轮廓  做多边形逼近  获取四个顶点
arc_len = cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,float(0.04)*arc_len,True)
img_draw = img.copy()
# approxpoints1 = np.float32(approx).reshape(-1,2)
print(approx)
points2 = np.float32([[max(points1[:, 0]), min(points1[:, 1])],  # 右上角[min(points1[:, 0]), min(points1[:, 1])],  # 左上角[min(points1[:, 0]), max(points1[:, 1])],  # 左下角[max(points1[:, 0]), max(points1[:, 1])],  # 右下角])M = cv2.getPerspectiveTransform(points1,points2)
img_draw = cv2.warpPerspective(img_draw,M,(img.shape[1],img.shape[0]))# 画轮廓# 获取透视变换矩阵
# 进行透视变换# 输出图形
cv2.imshow('img',img)
cv2.imshow('img_copy',img_copy)
cv2.imshow('img_draw',img_draw)
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_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 高斯滤波
img_blur = cv2.GaussianBlur(img_gray,(5,5),1)
# 边缘检测
img_canny = cv2.Canny(img_blur,50,150)
c,h = cv2.findContours(img_canny,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img,c,-1,(0,0,255),2)cv2.imshow('image',img)cv2.imshow('img_canny',img_canny)
cv2.waitKey(0)

题目6:车牌识别预处理 

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

  1. 读取一张包含车牌的图像。
  2. 将图像转换为灰度图以简化处理。
  3. 使用高斯滤波器平滑图像,减少噪声干扰。
  4. 应用Canny边缘检测算法检测图像中的边缘。
  5. 查找图像中的轮廓。
  6. 逐一遍历轮廓。
  7. 设定一个面积双阈值,只保留面积在该阈值的轮廓。
  8. 计算这些轮廓的长宽比,长宽比ratio在2到5.5之间的,在原图上用矩形框标出,这些轮廓可能是车牌的候选区域。

python">import cv2
import matplotlib.pyplot as plt
import numpy as np# 读取车牌图像
img =cv2.imread('./img_1.png')# 转化为单通道图像便于处理
img= cv2.resize(img,dsize=None,fx=0.5,fy=0.5)img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 使用高斯滤波平滑图像,减少噪声干扰
img_blur = cv2.GaussianBlur(img_gray,(5,5),1)# 使用canny检测图像边缘
img_canny =cv2.Canny(img_blur,50,150)# 查找轮廓点集
c,_ = cv2.findContours(img_canny,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓 寻找面积合适的图像
for cnt in c:if cv2.contourArea(cnt)<900 or cv2.contourArea(cnt)>81000000:continueelse:# 计算长宽比arc_len = cv2.arcLength(cnt,  # 轮廓True)  # 表示轮廓是否闭合approx = cv2.approxPolyDP(cnt,  # 轮廓float(0.004) * arc_len,  # 这是从原始轮廓到近似多边形的最大距离,决定了逼近精度True  # 是否闭合)  # 返回逼近多边形的 坐标点集x, y, w, h = cv2.boundingRect(approx)ratio = w / hif 2.0 < ratio < 4.5:  # 设定范围减免因图像扭曲产生的误差cv2.rectangle(img,[x, y],  # 左上角坐标[x + w, y + h],  # 右下角坐标(0, 0, 255),  # 矩形颜色2  # 矩形线条粗细)cv2.imshow('img',img)
cv2.imshow('img_b', img_canny)
cv2.waitKey(0)

 

交通信号灯识别‌:

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

思路分析‌:

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

python">import cv2
import numpy as np
img = cv2.imread('./demo111.png')# 转化hsv空间
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 红色空间
hsv_min2 = np.array([0,43,46])
hsv_max2 = np.array([10,255,255])
hsv_min1 = np.array([156,43,46])
hsv_max1 = np.array([180,255,255])
mask_1 = cv2.inRange(img_hsv,hsv_min1,hsv_max1)
mask_2 = cv2.inRange(img_hsv,hsv_min2,hsv_max2)
mask_red = cv2.bitwise_or(mask_1,mask_2)
mask_red = cv2.GaussianBlur(mask_red,(3,3),1)
c,_ = cv2.findContours(mask_red,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[1]
img = cv2.drawContours(img,[c],-1,(0,0,255),2)# 绿色空间
hsv_min3 = np.array([35,43,46])
hsv_max3 = np.array([99,255,255])
mask_green = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_green = cv2.GaussianBlur(mask_green,(3,3),1)
c,_ = cv2.findContours(mask_green,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[0]
img = cv2.drawContours(img,[c],-1,(0,255,0),2)# 黄色空间
hsv_min4 = np.array([11,20,20])
hsv_max4 = np.array([34,255,255])
mask_yellow = cv2.inRange(img_hsv,hsv_min4,hsv_max4)
mask_yellow = cv2.GaussianBlur(mask_yellow,(3,3),1)
c,_ = cv2.findContours(mask_yellow,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(c,key=cv2.contourArea,reverse=True)[0]
img = cv2.drawContours(img,[c],-1,(0,255,255),2)mask = cv2.bitwise_or(mask_red,mask_yellow,mask_green)
img_mask_color = cv2.bitwise_and(img,img,mask=mask)cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('img_mask_color',img_mask_color)cv2.waitKey(0)

 

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

‌思路分析‌:

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

 

python">import cv2
import numpy as np
img = cv2.imread('./duck.png')
img = cv2.resize(img,dsize=None,fx=0.4,fy=0.4)
# 转化hsv空间
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 红色空间
hsv_min2 = np.array([0,43,46])
hsv_max2 = np.array([10,255,255])
hsv_min1 = np.array([156,43,46])
hsv_max1 = np.array([180,255,255])
mask_1 = cv2.inRange(img_hsv,hsv_min1,hsv_max1)
mask_2 = cv2.inRange(img_hsv,hsv_min2,hsv_max2)
mask_red = cv2.bitwise_or(mask_1,mask_2)
mask_red = cv2.GaussianBlur(mask_red,(3,3),1)# 绿色空间
hsv_min3 = np.array([35,43,46])
hsv_max3 = np.array([99,255,255])
mask_green = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_green = cv2.GaussianBlur(mask_green,(3,3),1)# 黑色空间
hsv_min3 = np.array([0,0,40])
hsv_max3 = np.array([180,255,46])
mask_black = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_black = cv2.GaussianBlur(mask_green,(3,3),1)# 蓝色空间
hsv_min3 = np.array([78,43,46])
hsv_max3 = np.array([124,255,255])
mask_blue = cv2.inRange(img_hsv,hsv_min3,hsv_max3)
mask_blue = cv2.GaussianBlur(mask_blue,(3,3),1)mask = cv2.bitwise_or(mask_red,mask_black,mask_blue)mask_color = cv2.bitwise_and(img,img,mask=mask)c,_ = cv2.findContours(mask,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContours(img,c,-1,(0,255,255),2)cv2.imshow('image',img)
cv2.imshow('mask',mask)
cv2.imshow('img_mask_color',mask_color)cv2.waitKey(0)

图像预处理与特征提取‌

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

 

 

python">import cv2
import numpy as np# 读取图片
img = cv2.imread('./img_2.png')# 灰度化  二值化
img_gary = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,img_binary = cv2.threshold(img_gary,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)# 高斯滤波
img_blur = cv2.GaussianBlur(img_binary,(3,3),1)# 开运算消除噪点 腐蚀和膨胀
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
img_erode = cv2.erode(img_blur,kernel)
img_dilate = cv2.dilate(img_erode,kernel)# 寻找轮廓
contours,_ = cv2.findContours(img_dilate,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
img_copy = img.copy()# 循环遍历轮廓
for cnt in contours:M = cv2.moments(cnt)if int(M['m00'] )== 0:continueelse:# 排序非常小的轮廓后,寻找与图形相似形状# 把周长的几倍长度的线段作为一条边arc_len = cv2.arcLength(cnt,   # 轮廓True) # 表示轮廓是否闭合approx = cv2.approxPolyDP(cnt, # 轮廓float(0.04)*arc_len, #这是从原始轮廓到近似多边形的最大距离,决定了逼近精度True # 是否闭合) # 返回逼近多边形的 坐标点集# 进行形状判断if len(approx) == 4:# 需要进一步判断是正方形还是非正方形x,y,w,h = cv2.boundingRect(approx)ratio = w/hshape = 'rectangle'color = (0,255,0)img_copy = cv2.drawContours(img_copy, contours, -1, (0, 0, 0), 1)str1 = shape+'area:'+str(cv2.contourArea(cnt))str2 = 'len:'+str(cv2.arcLength(cnt,True))# 先计算轮廓形状的中心坐标cX = int(M['m10']/M['m00'])cY = int(M['m01']/M['m00'])# 将识别到的轮廓形状的文字写道轮廓的重点处youhua.pngcv2.putText(img_copy, # 图片str1,  # 要添加的文字字符串(cX,cY), # 要输入文字的坐标cv2.FONT_HERSHEY_SIMPLEX,# 字体类型0.4, # 缩放color)cv2.putText(img_copy,  # 图片str2,  # 要添加的文字字符串(cX, cY+15),  # 要输入文字的坐标cv2.FONT_HERSHEY_SIMPLEX,  # 字体类型0.4,  # 缩放color)# 输出数据
cv2.imshow('image',img)
cv2.imshow('img_copy',img_copy)
cv2.waitKey(0)


http://www.ppmy.cn/news/1555341.html

相关文章

【Axure视频教程】中继器表格——打开指定页面

今天教大家在Axure制作中继器表格--打开指定页面的原型模板&#xff0c;鼠标点击表格里员工所在行的查看简历按钮&#xff0c;就可以跳转至该员工对应的简历页面。这个原型模板是用中继器制作的&#xff0c;所以使用也很简单&#xff0c;只需要在中继器表格里填写对应内容&…

Android 异形屏设备设置沉浸式界面

Android 异形屏设备设置沉浸式界面 问题 由于业务需要&#xff0c;应用需要配置沉浸式界面&#xff0c;但设置全屏时&#xff0c;会遇到异形屏采用传统的全屏设置模式无效问题。 解决方案 Android P版本提供参数layoutInDisplayCutoutMode供实现沉浸式设置。layoutInDispl…

c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除

老规矩&#xff0c;点赞评论收藏关注&#xff01;&#xff01;&#xff01; 目录 线性表 其特点是&#xff1a; 算法实现&#xff1a; 运行结果展示 链表 插入元素&#xff1a; 删除元素&#xff1a; 算法实现 运行结果 线性表是由n个数据元素组成的有限序列&#xff0c;每个元…

双重AEB:将基于规则的方法与多模态大型语言模型相结合,以实现有效的紧急制动(202410)

Dual-AEB: Synergizing Rule-Based and Multimodal Large Language Models for Effective Emergency Braking 双重AEB&#xff1a;将基于规则的方法与多模态大型语言模型相结合&#xff0c;以实现有效的紧急制动 Abstract Automatic Emergency Braking (AEB) systems are a c…

PyTorch 梯度计算详解:以 detach 示例为例

PyTorch 梯度计算详解&#xff1a;以 detach 示例为例 在深度学习中&#xff0c;梯度计算是训练模型的核心步骤&#xff0c;而 PyTorch 通过自动微分&#xff08;autograd&#xff09;模块实现了高效的梯度求解。本文将通过一个实际代码示例&#xff0c;详细讲解 PyTorch 的梯…

测试脚本并发多进程:pytest-xdist用法

参考&#xff1a;https://www.cnblogs.com/poloyy/p/12694861.html pytest-xdist详解&#xff1a; https://www.cnblogs.com/poloyy/p/14708825.html 总 https://www.cnblogs.com/poloyy/category/1690628.html

`BertModel` 和 `BertForMaskedLM

是的&#xff0c;BertModel 和 BertForMaskedLM 是两个不同的类&#xff0c;它们的功能和应用场景有所区别。以下是两者的详细对比&#xff1a; 1. BertModel 功能 BertModel 是基础的 BERT 模型&#xff0c;输出的是编码器的隐层表示&#xff08;hidden states&#xff09;&…

MySQL八股文

MySQL 自己学习过程中的MySQL八股笔记。 主要来源于 小林coding 牛客MySQL面试八股文背诵版 以及b站和其他的网上资料。 MySQL是一种开放源代码的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;使用最常用的数据库管理语言–结构化查询语言&#xff08;SQL&…