python的opencv最最基础初学

localhost中详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示_opencv imshow-CSDN博客

其实以下均为numpy

显示一张图片

import cv2 ####opencv读取的格式是BGR 
import matplotlib.pyplot as plt 
import numpy as np
%matplotlib inline
img=cv2.imread('ldz.jpg')
img

 出现一个庞大数组,这里不予显示

#图像的显示,也可以创建多个窗口
cv2.imshow('ldz',img)
#等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destroyAllWindows() 
def cv_show(name,img):
    cv2.imshow(name,img) 
    cv2.waitKey(4090)
    cv2.destroyAllWindows()
img.shape
结果是(2400, 3840, 3)    HWC

显示一张灰度图

img=cv2.imread('ldz.jpg',cv2.IMREAD_GRAYSCALE)
img
img.shape

结果是(2400, 3840)

 保存图片

cv2.imwrite('ldz.jpg',img)
type(img)#格式 如numpy.ndarray
img.size#像素点
img.dtype#数据类型

数据读取视频

#数据读取-视频
#cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。

#如果是视频文件,直接指定好路径即可。
 

vc = cv2.VideoCapture('test.mp4') 

#检查是否打开正确
if vc.isOpened():
open_ ,frame=vc.read() 
else:
open=False
 
while open:
    ret, frame=vc.read() 
    if frame is None: 
      break
    if ret== True:
    gray= cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) 
#就是如果能读到的话,就将让读到的那一帧转化为灰度图像
    cv2.imshow('result',gray)
    if cv2.waitKey(10)& 0xFF==27: 
        break
#ret 是个布尔值是否读到图片,frame表示具体图片
#如果在10ms 内没有按键值,cv2.waitKey返回为-1,这个时候-1& 0xFF.如果等于27就满足了按下esc键退出
vc.release()
cv2.destroyAllWindows() 

截取部分图像数据

img=cv2.imread('cat.jpg')
cat=img[0:40,0:200]
cv_show('cat',cat)

颜色通道提取 

#调图时要加上cv2.waitKey和cv2.destroyAllWindows才能防止崩溃
b,g,r=cv2.split(img)
r

r.shape

img=cv2.merge((b,g,r)) 

img.shape

img=cv2.merge((b,g,r))
img.shape
#只保留R
cur_img=img.copy() 
cur_img[:,:,0]=0 
cur_img[:,:,1]=0 
cv_show('R',cur_img) 

边界填充

填充后能使做卷积后,尺寸保持不变,而扩大通道的深度

为什么出来的图片偏蓝色。。。浅蓝色是因为默认通道  bgr plt默认的是rgb  改下bgr to rgb

top_size, bottom_size, left_size, right_size =(50,50.50,50)

replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REFLECT_101)
wrap = cv2. copyMakeBorder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img, top_size, bottom_size, left_size, right_size,cv2.BORDER_CONSTANT, value=0)


import matplotlib. pyplot as plt
plt. subplot(231), plt. imshow(img, 'gray'), plt. title('ORIGINAL')
plt. subplot(232),plt. imshow(replicate, 'gray'), plt. title('REPLICATE')
plt. subplot(233), plt. imshow(reflect, 'gray'), plt. title('REFLECT')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt. title('REFLECT_101')
plt. subplot(235), plt. imshow(wrap, 'gray'), plt. title('WRAP')
plt. subplot(236), plt. imshow(constant, 'gray'), plt. title('CONSTANT')

plt.show0
  • BORDER_REPLICATE:夏制法,也就是复制最边缘像素.
  • BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制 比如fedcbalabcdefghlhgfedcb
  • BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴对称,gfedcb|abcdefgh|gfedcba
  • BORDER_WRAP:外包装法cdefgh|abcdefgh|abcdefgAE的动态拼贴
  • BORDER_CONS1ANT:常量法,常数值填充

 四个边角分别用x轴和y轴做相应的变换映射到图像坐标中去,取像素点填充

cv.imshow模式是BGR模式,而plt.imshow模式为RGB模式,因此需要转化才能正确显示

前面那个说错了,这个设置了gray参数,只显示灰度图的时候不需要转换

数值计算

img_cat=cv2.imread('cat.jpg')
img_dog=cv2.imread('dog.jpg')

img_cat2=img_cat+10#这是numpy里的广播机制  对矩阵的每个值都加10
img_cat[:5,:,0]#打印前五行

img_cat2[:5,:,0]

(img_cat+img_cat2)[:5,:,0]#多的会和255取余

cv2.add(img_cat,img_cat2)[:5,:,0]

图像融合

img_cat+img_dog
#警告这些需要你去学pandas,matplotlib numpy才行 不然这里你不懂doge 啊米诺斯
img_shape

img_dog=cv2.resize(img_dog,(500,414))
ing_dog.shape
#是resize,直接改变大小,reshape仅在改变维度,数据量不匹配就报错了
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)

#因为shape输出的是高和宽,而resize()需要的参数是宽和高
#反着是因为resize的读取是(列数,行数).
#cv2这个库读取到RGB是BGR,错误。BGR指的是颜色通道,shape出来时长宽和颜色通道数

#cv2.imread函数读取图片,颜色通道排列是BGR,plt.imread()读取图片颜色通道是RGB,两个不一样
#发现plt颜色不对,是因为cv2.imread读取的图像保存为BGR格式,而plt.imshow()以为你输入的是RGB

plt.imshow(res)

 拉缩图片

res=cv2.resize(img,(0,0),fx=3,fy=1)
plt.imshow(res)#开头记得import matplotlib.pyplot as plt

图像阈值

  •  ret, dst = cv2.threshold(src, thresh, maxval, type)
  •  src:输入图,只能输入单通道图像,通常来说为灰度图
  •  dst:输出图
  •  thresh:值
  •  maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  •  type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY;   cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC;  cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
  •  cv2.THRESH_BINARY超过值部分取maxval(最大值),否则取0
  •  cv2.THRESH_BINARY_INV THRESH_BINARY的反转
  •  cv2.THRESH_TRUNC大于值部分设为值,否则不变
  •  cv2.THRESH_TOZERO大于值部分不改变,否则设为0
  •  cv2.THRESH_TOZERO_INVTHRESH_TOZERO的反转

这是阈值分割的接口,将阈值以上或以下的像素全设置为同一个数,简单函数就能实现

ret, thresh1 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_BINARY)
ret, thresh2 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_BINARY_INV)
ret, thresh3 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TRUNC)
ret, thresh4 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TOZERO)
ret, thresh5 = cv2. threshold(img_gray, 127, 255, cv2. THRESH_TOZERO_INV)

titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(2, 3, i+1), plt. imshow(images[i], 'gray')
    plt.title(titles[i])
    plt. xticks(),plt. yticks([])
plt.show()

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

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

相关文章

“一键解锁复古魅力:底片效果瞬间生成!“

时光荏苒,岁月如梭。你是否曾怀念那些旧时光里,老照片所散发出的独特韵味?那种历经岁月沉淀的底片效果,仿佛能带我们回到那些被遗忘的角落,重温那些温馨的瞬间。 首先第一步,我们要进入视频剪辑高手&#…

算法---滑动窗口练习-6(找到字符串中所有字母异位词)

找到字符串中所有字母异位词 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;找到字符串中所有字母异位词 2. 讲解算法原理 有效字符个数count更新条件&#xff1a;满足【hash1表&#xff08;遍历s的表&#xff09;中对应元素出现次数<hash2表&am…

C语言之归并排序

目录 一 简介 二 代码实现 三 时空复杂度 A.时间复杂度&#xff1a; B.空间复杂度&#xff1a; C.总结&#xff1a; 一 简介 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的高效排序算法&#xff0c;其基本思想是将一个大问题分解为若干个规模较小且相…

RK3568平台开发系列讲解(基础篇)内核是如何发送事件到用户空间

🚀返回专栏总目录 文章目录 一、相关接口函数二、udevadm 命令三、实验沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与内核通信的一种方式。…

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

Golang实现Redis分布式锁&#xff08;Lua脚本可重入自动续期&#xff09; 1 概念 应用场景 Golang自带的Lock锁单机版OK&#xff08;存储在程序的内存中&#xff09;&#xff0c;分布式不行 分布式锁&#xff1a; 简单版&#xff1a;redis setnx》加锁设置过期时间需要保证原…

数据结构的概念大合集01(含数据结构的基本定义,算法及其描述)

概念大合集01 1、数据结构基础的定义2、数据结构2.1 数据元素之间关系的集合2.2数据结构的三要素2.2.1数据的逻辑结构2.2.2数据的存储&#xff08;物理&#xff09;结构2.2.3数据的运算 3、数据类型4、抽象数据类型类型&#xff08;ADT&#xff09;5、算法及其描述5.1算法的5个…

ChatGLM3-6B独立部署提供HTTP服务failed to open nvrtc-builtins64_121.dll

背景 我在本地windoes部署ChatGLM3-bB&#xff0c;且希望部署后能提供HTTP server的能力。 模型部署且启动是成功了&#xff0c;但是在访问生成接口/v1/chat/completions时报错failed to open nvrtc-builtins64_121.dll。 问题详细描述 找不到nvrtc-builtins64_121.dll Runtime…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

Windows→Linux,本地同步到服务器

适用背景&#xff1a; 用自己电脑修改代码&#xff0c;使用实验室/公司的服务器炼丹的朋友 优势&#xff1a; 本地 <--> 服务器&#xff0c;实时同步&#xff0c;省去文件传输的步骤 本地改 -> 自动同步到服务器 -> 服务器跑代码 -> 一键同步回本地&#xff…

汽车氛围灯静电浪涌的难点

汽车氛围灯&#xff0c;顾名思义&#xff0c;是烘托车内氛围的照明灯&#xff0c;是汽车内饰情感化设计的一种体现。 一般有暖色&#xff08;红色等&#xff09;和冷色系&#xff08;蓝色、紫色等&#xff09;两种&#xff0c;在夜晚开启后绚丽浪漫&#xff0c;可营造车内情调&…

JSP+Servlet开发汽车租赁管理系统

开发工具&#xff1a;EclipseJdkTomcatSQLServer数据库 链接: https://pan.baidu.com/s/1O5tGguNl6V1CvSpN-amNXA 提取码: exak 如果需要&#xff0c;联系下面的客服人员

SQL的执行与优化

文章目录 MySQL查询原理与优化一、select语句的执行顺序二、join 的执行与优化1、驱动表 & 被驱动表2、Simple Nested Loop Join3、Index Nested Loop Join4、Block Nested Loop Join5、Hash Join6、join 优化小结 三、on 与 where 对比四、group by 的执行与优化1、group …

在Docker容器中配置`code-server`以访问宿主机的Docker环境

在Docker容器中配置code-server以访问宿主机的Docker环境 部分内容使用gpt生成&#xff0c;但经过测试可用。 要在code-server容器内部安全地管理和访问宿主机的Docker环境&#xff08;主要是为了访问宿主机的texlive&#xff09;&#xff0c;遵循以下步骤能够确保流畅的集成和…

Day66:WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBC&MyBatis Java安全-XXE注入-Reader&Builder Java安全-SSTI模版-Thymeleaf&URL Java安全-SPEL表达式-SpringBoot框架 知识点&#xff1a; 1、Java安全-SQL注入-JDBC&MyBatis 2、Java安全-XXE注…

vanna:基于RAG的text2sql框架

文章目录 vanna简介及使用vanna的原理vanna的源码理解总结参考资料 vanna简介及使用 vanna是一个开源的利用了RAG的SQL生成python框架&#xff0c;在2024年3月已经有了5.8k的star数。 Vanna is an MIT-licensed open-source Python RAG (Retrieval-Augmented Generation) fram…

SAP CAP篇十五:写个ERP的会计系统吧,Part II

本文目录 本系列文章目标开发步骤数据库表设计初始数据初始数据&#xff1a;AccountCategories初始数据&#xff1a;AccountUsages初始数据&#xff1a;ChartOfAccounts初始数据&#xff1a;AccountSubjects Service 定义生成Fiori AppApp运行 本系列文章 SAP CAP篇一: 快速创…

【GitHub】使用git链接下载很慢?试试服务器配置SSH,起飞

参考文献 保姆级教学&#xff0c;教你用配置SSH拉取github代码 CentOS ssh -T gitgithub.comgit config --global user.name "learnore" git config --global user.email "15200831505163.com"cd /root/.ssh vim id_rsa.pubGitHub Settings 结果 下载速…

路由器端口转发远程桌面控制:一电脑连接不同局域网的另一电脑

一、引言 路由器端口转发&#xff1a;指在路由器上设置一定的规则&#xff0c;将外部的数据包转发到内部指定的设备或应用程序。这通常需要对路由器进行一些配置&#xff0c;以允许外部网络访问内部网络中的特定服务和设备。端口转发功能可以实现多种应用场景&#xff0c;例如远…

通用的springboot web jar包执行脚本,释放端口并执行jar包

1、通用的springboot web jar包执行脚本&#xff0c;释放端口并执行jar包&#xff1a; #!/bin/bash set -eDATE$(date %Y%m%d%H%M) # 基础路径 BASE_PATH/data/yitu-projects/yitu-xzhq/sftp # 服务名称。同时约定部署服务的 jar 包名字也为它。 SERVER_NAMEyitu-server # 环境…

java小型人事管理系统

开发工具&#xff1a; MyEclipseJdkTomcatSQLServer数据库 运行效果视频&#xff1a; https://pan.baidu.com/s/1hshFjiG 定制论文&#xff0c;联系下面的客服人员