OpenCV Python 图像处理入门

news2024/11/15 10:34:18

OpenCV入门

OpenCV:轻量、高效、开源。最广泛使用的计算机视觉工具。

下面涉及图片的读取,RGB彩色通道,区域裁剪,绘制图形和文字,均值滤波,特征提取,模板匹配,梯度算法,阈值算法,形态学操作,摄像头读取。

  1. 第一个test01程序: 学习如何运行OpenCV的基本示例。
  2. 图像的彩色通道BGR: 了解OpenCV中图像颜色通道的表示方式。
  3. 图像的裁剪: 学习如何对图像进行裁剪操作。
  4. 绘制直线、矩形、圆形: 实践在图像上绘制基本图形。
  5. 均值滤波处理图像噪点: 使用均值滤波器去除图像噪声。
  6. 图像特征点的提取: 学习如何提取图像中的特征点。
  7. 模板匹配扑克牌上的菱形: 实现模板匹配技术。
  8. 图像的梯度算法与边缘检测: 探索图像梯度和边缘检测算法。
  9. 图像的二值化: 学习如何将图像转换为二值图像。
  10. 图像形态学之腐蚀和膨胀: 实践图像形态学操作。
  11. 调用电脑摄像头: 学习如何使用OpenCV捕获实时视频流。

1.第一个test01程序

import cv2
#查看cv2的版本
#print(cv2.__version__)
print(cv2.getVersionString())

image = cv2.imread('opencv_logo.jpg')
#打印图片的维度(numpy)
print(image.shape)

#显示图片
cv2.imshow('image', image)
cv2.waitKey(0)

结果:

 

2.图像的彩色通道BGR

图像的彩色通道,计算机对于图像色彩的描述,普遍使用了RGB3原色原理,也就是任何颜色都是由RGB,红绿蓝三种颜色按一定比例混合而成的。

对于open CV来说,存储一张彩色图片等同于存储三张灰度图,它们被存储在open CV图像数据的第三个维度上,灰度范围是零到255,OpenCV对颜色的存储顺序是BGR,与常见的RGB顺序刚好相反。当显示器需要渲染这张图片时,计算机会依次取出图像数据中的三张灰度图,再把它们分别投影到显示器的蓝色,绿色和红色的led芯片上。

import cv2
image = cv2.imread('opencv_logo.jpg')

#BRG
cv2.imshow('blue', image[:,:,0])
cv2.imshow('green', image[:,:,1])
cv2.imshow('red', image[:,:,2])
#灰度图
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)

cv2.waitKey(0)

结果:

 3.图像的裁剪

import cv2

image = cv2.imread('opencv_logo.jpg')
#裁剪图片
crop=image[10:170,40:200]
#打印裁剪的图片
cv2.imshow('crop',crop)
cv2.waitKey(0)

对于OpenCV索引的顺序是先横行后纵列,也就是说:索引10:170对应的是第10横行到第170,所以40:200对应的是第40,纵列到第200列。这个索引顺序与某些图像处理工具是不同的,比如加州理工大学基于MATLAB的图像处理工具包,就使用了相反的索引顺序。

结果:

 

4.绘制直线、矩形、圆形

OpenCV的图像数据实际上是numpy数组数据结构,所以可以直接使用number派创建一个黑色画布,具体代码如下:np.zeros维度300x300x3,灰度的数值类型是无符号八位整数nside integer eight,把创建的image变量显示出来,可以看到它是300×300的黑色画布。

import cv2
import numpy as np
image = np.zeros((300, 300, 3), np.uint8)

#在画布上绘制直线
cv2.line(image, (100, 200), (250, 250), (250, 250, 0), 2)
#在画布上绘制矩形
cv2.rectangle(image, (30, 100), (60, 150), (0, 250, 0), 2)
#在画布上绘制圆形
cv2.circle(image, (150, 100), 20, (0, 0, 255), 3)
#在画布上绘制字符
cv2.putText(image,"hello",(100,50),0,1,(255,255,255),2)

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

结果:

5.均值滤波处理图像噪点

import cv2
image = cv2.imread('plane.jpg')

#高斯滤波器
gauss = cv2.GaussianBlur(image,(5,5),0)
#均值滤波器
median = cv2.medianBlur(image,5)

cv2.imshow('image',image)
cv2.imshow('gauss',gauss)
cv2.imshow('median',median)
cv2.waitKey(0)

结果:

 

6.图像特征点的提取

import cv2
image = cv2.imread('opencv_logo.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#获取图像中的特征点,最多返回500个点,点的质量优于0.1,特征点之间的距离大于十个像素
corners = cv2.goodFeaturesToTrack(gray,500, 0.1, 10)
#把每一个点标记出来,显示结果
for corner in corners:
    x, y = corner.ravel()
    cv2.circle(image, (int (x), int(y)), 3, (255, 0, 255), -1)

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

结果:

 

7.模板匹配扑克牌上的菱形

目标是匹配扑克牌上的菱形,这张图片上一共有九个菱形,把它们都找出来。

import cv2
import numpy as np
image = cv2.imread('poker.jpg')
#把彩色图像转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#选取图像的一个区域作为匹配模板,使用索引横行75~105,纵列235~265,这个区域刚好包含一个菱形
template = gray[75:105,235:265]
#把带检测图像和模板都各自标准化,再来计算匹配度,这样可以保证匹配结果不受光照强度的影响
match = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF_NORMED)
#找出匹配系数大于0.9的匹配点,再把模板图案的长和宽求出来
locations = np.where(match >= 0.9)
w,h = template.shape[0:2]
#循环遍历每一个匹配点,在原始图像上画出对应的矩形框,显示结果,9个菱形都被找到了。
for p in zip(*locations[::-1]):
    x1,y1 = p[0], p[1]
    x2,y2 = x1 + w, y1 + h
    cv2.rectangle(image, (x1,y1), (x2,y2), (0, 255, 0), 2)

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

结果:

8.图像的梯度算法与边缘检测

import cv2
#读取图像的灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#拉普拉斯算子给出了图像明暗变化的趋势
laplacian = cv2.Laplacian(gray, cv2.CV_64F)
#canny边缘检测
canny = cv2.Canny(gray, 100, 200)
cv2.imshow("gray", gray)
cv2.imshow("Laplacian", laplacian)
cv2.imshow("Canny", canny)
cv2.waitKey(0)

 结果:

9.图像的二值化(阈值:非黑即白)

import cv2
#灰度图
gray = cv2.imread('bookpage.jpg',cv2.IMREAD_GRAYSCALE)
#定义一个固定阈值
ret,binary = cv2.threshold(gray,10,255,cv2.THRESH_BINARY)
binary_adaptive = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,115,2)
ret1,binary_otsu = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

cv2.imshow('gray',gray)
cv2.imshow('binary',binary)
cv2.imshow('binary_adaptive',binary_adaptive)
cv2.imshow('binary_otsu',binary_otsu)
cv2.waitKey(0)

结果:

10.图像形态学之腐蚀和膨胀

import cv2
import numpy as np
#读取灰度图
gray = cv2.imread("opencv_logo.jpg", cv2.IMREAD_GRAYSCALE)
#使用反向阈值,因为原始图片中背景是白色的,而我们想要把背景变为黑色,图案变为白色
_, binary = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((5, 5), np.uint8)
#腐蚀
erosion = cv2.erode(binary, kernel)
#膨胀
dilation = cv2.dilate(binary, kernel)
cv2.imshow("binary", binary)
cv2.imshow("erosion", erosion)
cv2.imshow("dilation", dilation)
cv2.waitKey(0)

结果:

 

11.调用电脑摄像头

import cv2
#电脑上只有一个摄像头,所以序号是零
capture = cv2.VideoCapture(0)
#对于摄像头的采集是连续不断的,也就是说要循环读取每一帧的画面,
# 由于不确定循环多少次,我们先让它做死循环
while True:
    ret, frame = capture.read()
    # 读取摄像头中的画面,把它展示出来
    cv2.imshow('frame', frame)
    key = cv2.waitKey(1)
    if key != -1:
        break
#释放指针
capture.release()

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马Java零基础视频教程精华部分_19_lambda表达式

系列文章目录 文章目录 系列文章目录一、函数式编程二、Lambda表达式的标准格式三、Lambda表达式的省略写法 一、函数式编程 函数式编程(Functional programming)是一种思想特点。 之前的面向对象:先找对象,让对象做事情。如下图所示,这样会有点小麻烦。…

(一)基于自组织结构的多目标粒子群优化算法(SMOPSO)的无人机三维路径规划(MATLAB代码)

一、无人机多目标优化模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节,无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上,计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找…

理解Pytorch中的collate_fn函数

PyTorch中的DataLoader是最常用的类之一,这个类有很多参数(14 个),但大多数情况下,你可能只会使用其中的三个:dataset、shuffle 和 batch_size。其中collate_fn是比较少用的函数,这对初学者来说…

2024年国家数据局第一批20个“数据要素×”典型案例解析

国家数据局首批20个“数据要素”典型案例解析 1、简介1.1 背景简介1.2 典型案例分类 2、案例解析2.1 工业制造领域案例1:数据要素驱动适应多式联运需求的运输装备协同制造案例2:打造工业数据空间 赋能产业链上下游发展 2.2 现代农业领域案例3&#xff1a…

07一阶电路和二阶电路的时域分析

一阶电路和二阶电路的时域分析 时域分析、频域分析、复频域分析本应该在信号与系统,或者数字信号处理这一章节里面进行处理的。 但在电路理论中也有这些知识,那就要好好掌握一下,打个底。详细细致的部分放到信号与系统里面去掌握

Spring Web MVC入门(中)

1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟; 1.1 传递单个参数 接收单个参数,在Spring MV…

七段S型加减速算法原理及其多种形状仿真

1、基本7段S型: 七段S型加减速的位置、速度、加速度、加加速度曲线如下图所示。 加加速度: 加速度: 速度: 位置: 以上是7段S型加减速的最基本公式,在实际应用中还需要考虑到起始和终止速度大于匀速速度的情…

【JavaSE】解读Java中的toString方法

前言: 在Java中,toString方法来自java.lang.Object 类,然后所有对象都继承该Object 类。默认情况下,它的作用是返回对象的字符串表示形式。在实际开发中,重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…

Verilog基础:模块端口(port)定义的语法(2001标准)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 Verilog中的端口定义有两种风格,一种是Verilog Standard 1995风格,一种是Verilog Standard 2001风格,本文将对Verilog Standar…

C语言基础11指针

指针的引入 为函数修改实参提供支持。 为动态内存管理提供支持。 为动态数据结构提供支持。 为内存访问提供另一种途径。 指针概述 内存地址: 系统为了内存管理的方便,将内存划分为一个个的内存单元( 1 个内存单元占 1 个字节&#xff09…

自动控制——状态观测器

自动控制——状态观测器 引言 在自动控制系统中,准确地了解系统的状态对实现高性能控制至关重要。然而,在许多实际应用中,我们无法直接测量系统的所有状态变量。这时,状态观测器(State Observer)就发挥了…

【LeetCode面试150】——209长度最小的子数组

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…

轻松上手MYSQL:精通正则表达式,数据匹配不再难!

🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL正则表达式函数之旅✨ 👋 大家好!文本学习…

【Cesium】Cesium图层请求完成的回调

有一个业务需要用到cesium图层请求完成的回调&#xff0c;翻了好久的文档终于给我找到&#x1f336;️。 是Cesium.ImageryProvider类的一个属性readyPromise 效果如下&#xff1a; Cesium图层请求完成的回调 完整代码如下&#xff1a; <html lang"en"><h…

PCDN业务推荐

神鸟云&蘑菇云最新业务推荐 &#x1f525;短Z业务-- 支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘 单价&#xff1a;移动1900 电联2500 http://oss.download.…

Mysql(四)---增删查改(进阶)

文章目录 前言1.查询操作1.1.全列查询1.2.指定列查询1.3.列名为表达式查询1.4.查询中使用别名1.5.去重查询1.6.排序1.6.2.NULL 1.7.条件查询1.8.分页查询 2.修改3.删除 前言 上一篇博客&#xff0c;我们学习了一些主键的概念&#xff0c;并且分别创造了一些示例表&#xff0c;…

通过相机来获取图片

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

Codeforces Round 966 (Div. 3)(A,B,C,D,E,F)

A. Primary Task 签到 void solve() {string s;cin>>s;bool bltrue;if(s.size()<2)blfalse;else{if(s.substr(0,2)"10"){if(s[2]0)blfalse;else if(s[2]1&&s.size()<3)blfalse; }else blfalse;}if(bl)cout<<"YES\n";else cout…

数据结构第二天

分文件编程实现&#xff1a; main.c #include <stdio.h> #include <stdlib.h> #include "seqlist.h"int main(int argc, char const *argv[]) {seqlist_p p CreateEpSeqlist();InsertIntoSeqlist(p, 0, 10);InsertIntoSeqlist(p, 1, 20);InsertIntoSeql…

打卡第四十五天:不同的子序列、两个字符串的删除操作、编辑距离

一、不同的子序列&#xff08;困难&#xff09; 题目 文章 视频 这道题目如果不是子序列&#xff0c;而是要求连续序列的&#xff0c;那就可以考虑用KMP。相对于72. 编辑距离简单了不少&#xff0c;因为本题相当于只有删除操作&#xff0c;不用考虑替换增加之类的。但相对于…