Python-OpenCV 处理图像(一):基本操作

2023-11-16

0x00. 图片读、写和显示操作

安装好 OpenCV 之后,首先尝试加载一张最简单的图片并显示出来,代码示例:

第一种方式使用cv2.cv的LoadImageShowImageSaveImage函数

import cv2.cv as cv

# 读图片
image=cv.LoadImage('img/image.png', cv.CV_LOAD_IMAGE_COLOR)#Load the image
#Or just: image=cv.LoadImage('img/image.png')

cv.NamedWindow('a_window', cv.CV_WINDOW_AUTOSIZE) #Facultative
cv.ShowImage('a_window', image) #Show the image

# 写图片
cv.SaveImage("thumb.png", thumb)
cv.WaitKey(0) #Wait for user input and quit

也可以直接使用cv2的imreadimwriteimshow函数

import numpy as np
import cv2

img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv2.imwrite('messigray.png',img)
    cv2.destroyAllWindows()

imread函数还可以定义加载的mode,默认是以RGB模式处理图片:

import cv2
grayImage = cv2.imread('MyPic.png', cv2.CV_LOAD_IMAGE_GRAYSCALE)
# 可选参数CV_LOAD_IMAGE_COLOR (BGR), CV_LOAD_IMAGE_GRAYSCALE (grayscale), CV_LOAD_IMAGE_UNCHANGED(neither)
cv2.imwrite('MyPicGray.png', grayImage)

0x01. 获取图片属性

import cv2
img = cv2.imread('img/image.png')
print img.shape
# (640, 640, 3)
print img.size
# 1228800
print img.dtype
# uint8
# 在debug的时候,dtype很重要

0x02. 输出文本

在处理图片的时候,我们经常会需要把一些信息直接以文字的形式输出在图片上,下面的代码将实现这个效果:

import cv2.cv as cv

image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image

font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font

y = image.height / 2 # y position of the text
x = image.width / 4 # x position of the text

cv.PutText(image,"Hello World !", (x,y),font, cv.RGB(255, 255, 255)) #Draw the text

cv.ShowImage('Hello World', image) #Show the image

cv.WaitKey(0)

cv2:

cv2.putText(frame, 'Hello World', (300,100), 0, 0.5, (0,0,255),2)

0x03. 缩放图片

下面的例子将实现缩放图片并保存,这个在使用 OpenCV 做图像处理的时候都是很常用的操作:

import cv2.cv as cv

im = cv.LoadImage("img/alkaline.jpg") #get the image

thumb = cv.CreateImage((im.width / 2, im.height / 2), 8, 3) #Create an image that is twice smaller than the original

cv.Resize(im, thumb) #resize the original image into thumb
#cv.PyrDown(im, thumb)

cv.SaveImage("thumb.png", thumb) # save the thumb image

cv2:

import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

#OR

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

0x04. 图像平移

import cv2
import numpy as np

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

0x05. 图像旋转

img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape

M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

0x06. 仿射变换

import cv2
import numpy as np

img = cv2.imread('mao.jpg')
rows,cols,ch = img.shape

pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])

M = cv2.getAffineTransform(pts1,pts2)

dst = cv2.warpAffine(img,M,(cols,rows))

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

0x07. 图像颜色变换

实际使用过程中,我们经常也需要对一些图片的颜色空间做一些改变之类的:

c2.cv:

import cv2.cv as cv
im=cv.LoadImage('img/fruits.jpg',cv.CV_LOAD_IMAGE_COLOR)
res = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3) #cv.CV_32F, cv.IPL_DEPTH_16S, ...
cv.Convert(im, res) 
cv.ShowImage("Converted",res)
res2 = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3)
cv.CvtColor(im, res2, cv.CV_RGB2BGR) # HLS, HSV, YCrCb, ....
cv.ShowImage("CvtColor", res2)
cv.WaitKey(0)
  • cv.Convert():将图片从一个颜色空间转到另一个颜色空间

  • cv.CvtColor(src, dst, code):

cv2:

cv2.cvtColor(input_image, flag)函数实现图片颜色空间的转换,flag 参数决定变换类型。如 BGR->Gray flag 就可以设置为 cv2.COLOR_BGR2GRAY 。

一个简单的例子,下面的代码实现识别摄像视频中蓝色的部分:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # 读取视频的每一帧
    _, frame = cap.read()

    # 将图片从 BGR 空间转换到 HSV 空间
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 定义在HSV空间中蓝色的范围
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])

    # 根据以上定义的蓝色的阈值得到蓝色的部分
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    res = cv2.bitwise_and(frame,frame, mask= mask)

    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

以上的代码给出了视频中获取兴趣对象的基本思想。

0x08. 通道的拆分/合并处理

对于一张图片的 R、G、B 通道,我们可以很方便的使用 OpenCV 获取并分离或者合并:

(这是将图像灰度化处理的一种方式)

cv2.cv

import cv2.cv as cv

orig = cv.LoadImage('img/fruits.jpg')
b = cv.CreateImage(cv.GetSize(orig), orig.depth, 1)
g = cv.CloneImage(b)
r = cv.CloneImage(b)
cv.Split(orig, b, g, r, None)

merged = cv.CreateImage(cv.GetSize(orig), 8, 3)
cv.Merge(g, b, r, None, merged)

cv.ShowImage("Image", orig)
cv.ShowImage("Blue", b)
cv.ShowImage("Green", g)
cv.ShowImage("Red", r)
cv.ShowImage("Merged", merged)

cv.WaitKey(0)

cv2

import cv2
img = cv2.imread('img/image.png')
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))

0x09. 图片添加边距

cv2.copyMakeBorder函数

import cv2
import numpy as np

BLUE = [255,0,0]

img1 = cv2.imread('opencv_logo.png')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python-OpenCV 处理图像(一):基本操作 的相关文章

  • 解决RuntimeError: CUDA unknown error - this may be due to an incorrectly set up environment

    RuntimeError CUDA unknown error this may be due to an incorrectly set up environment e g changing env variable CUDA VISI
  • IDEA代码规范插件(CheckStyle插件、alibaba插件)

    IDEA代码规范插件 CheckStyle插件 alibaba插件 代码规范插件 CheckStyle插件 alibaba插件 代码规范插件 CheckStyle插件 1 安装 打开idea的file settings plugins 再搜
  • 关于 微软商店无法加载页面 显示错误代码0x80131500的解决办法

    目录 一 误删系统文件导致Microsoft Store无法打开 1 运行 SFC 和 DISM 2 尝试修复或者重置微软应用商店 3 重新部署 Microsoft Store 4 运行Windows疑难解答 5 对系统镜像进行无损修复 二
  • 渗透测试——提权方式总结

    内容整理自网络 一 什么是提权 提权就是通过各种办法和漏洞 提高自己在服务器中的权限 以便控制全局 Windows User gt gt System Linux User gt gt Root 二 怎样进行提权 提权的方式有哪些 1 系统
  • AI算法工程师面试题基础精选

    AI算法工程师的相关面试题包括机器学习 深度学习以及强化学习等等 在面试时由于涉及范围比较广泛 一般面试官不会问一些比较深比较偏的问题 一般都会结合你经手的项目或者在校期间的项目进行一些算法的基础问题进行提问 在这里我们对在面试中常见中的基
  • 分享CSS3里box-shadow属性的使用方法,包括内阴影box-shadow:inset

    一 box shadow语法 box shadow none inset 可选值 不设置 为外投影 设置 为内投影 x offset 阴影水平偏移量 正方向为right y offset 阴影垂直偏移量 正方向为bottom blur ra
  • 记录好项目D16

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个电影购票系统 一 系统介绍 前台 普通用户注册 登录 注销 用户信息修改 邮箱 密码 头
  • Qt编译时,出现 first defined here,原因及解决方法

    场景 今天想着把之前写过的模块 都整合到一起 结果一编译程序就出现这个错误 原因 因为头文件出现重复包含了 后来我想了一下 我每个模块都是独立编写的 怎么会重复呢 然后去了pro文件里看了一下 里面果然有两个一模一样的头文件名 QT诚不欺我
  • Newtonsoft.Json基本使用

    Newtonsoft Json基本使用 使用强类型进行序列化反序列化 准备一个学生类 public class Student public string Name get set public int Age get set public
  • Android系统启动流程

    文章目录 总结 1 rc脚本语法规则 2 init进程启动 init first stage init second stage 3 ServiceManager启动 4 Zygote进程启动 5 Launcher启动 总结 android
  • [sql]使用sql语句增加列,并且设置默认值

    有的时候 我们需要对已存在的表进行插入列的情况 当然 可以使用navicat等工具直接可视化操作 命令行的话 如下 alter table 表名 add column 列名 数据类型 default 默认值 demo alter table
  • flutter开发实战-MethodChannel实现flutter与iOS双向通信

    flutter开发实战 MethodChannel实现flutter与iOS双向通信 最近开发中需要iOS与flutter实现通信 这里使用的MethodChannel 如果需要flutter与Android实现双向通信 请看 https
  • O-RAN专题系列-38:管理面-WG4.MP.V07-规范解读-第5章-软件管理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第5章 软件管理 5 1 Software Package 5 2 Software Inventory消息 5 3 Software

随机推荐

  • @Transactional事务注解

    1 实现原理 基于AOP面向切面的 它将具体业务与事务处理部分解耦 代码侵入性很低 2 Transactional注解可以作用于哪些地方 作用于类 当把 Transactional 注解放在类上时 表示所有该类的public方法都配置相同的
  • 使用正则表达式验证邮箱格式?

    需满足的验证逻辑 1 之前必须有内容且只能是字母 大小写 数字 下划线 减号 点 2 和最后一个点 之间必须有内容且只能是字母 大小写 数字 点 减号 且两个点不能挨着 3 最后一个点 之后必须有内容且内容只能是字母 大小写 数字且长度为大
  • python @register_第7.21节 Python抽象类—register注册虚拟子类

    上两节介绍了Python抽象类的真实子类的定义和使用 本节介绍另一种抽象类的实现方法 虚拟子类方法 一 相关概念 虚拟子类是将其他的不是从抽象基类派生的类 注册 到抽象基类 让Python解释器将该类作为抽象基类的子类使用 因此称为虚拟子类
  • Lua中的协程Coroutine

    一 协程是什么 1 线程 首先复习一下多线程 我们都知道线程 Thread 每一个线程都代表一个执行序列 当我们在程序中创建多线程的时候 看起来 同一时刻多个线程是同时执行的 不过实质上多个线程是并发的 因为只有一个CPU 所以实质上同一个
  • android语言切换的源码逻辑

    android语言的分发 会通过AMS去分发 AMS中保存着正在运行的进程 并分别分发给各个进程 各个进程在收到对应的事件的时候 会重启当前的页面 来应用config的改变 页面重启的过程中 Resource会读取当前的config 根据保
  • 【编程练习】回转寿司

    题目来源 牛客 美团2021校招笔试编程题 第3题 题目描述 题解 参考了别人的思路 这个问题可以分解为经典贪心 回转 当不考虑回转 环形 情形时 只需要用贪心求解最大连续子串值即可 当考虑回转 环形 情形时 可反向思考 就是 求解非环形连
  • matlab神经网络工具箱实现两个输入的BP神经网络

    请问各位大佬 matlab神经网络工具箱怎么实现具有两个特征的BP神经网络啊 是将以行为单位将每个样本的每一个特征按列存放就可以吗
  • upload-labs第1~2关 小试牛刀

    第一关 文件重命名 工具 Burp 蚁剑 原理 文件名修改 源码解析 先在前端判断是否为图片格式 是的话 就开始上传 也就是前端绕过 先传一个jpg格式的 再用burp抓包 改包 就可以实现前端验证绕过 绕过过程 文件上传肯定离不开一句话木
  • 全球根服务器分别部署在哪里?

    全球真的只有13台根服务器么 10台根服务器都在美国 如果根服务器被关闭 我们会不会被断网 关于DNS部署与根服务器的几点论述 知名网络黑客防御专家 东方联盟创始人郭盛华透露 根名称服务器是任何域名系统 DNS 服务器 它响应 DNS 根区
  • AI Challenger 2018 即将进入决赛,八大数据集抢先看

    雷锋网 AI 研习社消息 由创新工场 搜狗 美团点评 美图联合主办的 AI Challenger 2018 即将进入第二阶段比赛 今年的大赛主题是 用 AI 挑战真实世界的问题 主办方提供超过 300 万人民币奖金 8 月 29 日至 11
  • CMake下调用anaconda的pytorch及numpy传参CV::Mat给python(多线程版)

    经测试发现上次写的 CMake下调用anaconda的pytorch及numpy传参CV Mat给python 在多线程下就挂了 经过各种实验 终于完成了多线程的实现 在此分享一下 主要结构如下 Created by daybeha on
  • Vue中的三种绑定方式

    1 属性绑定 div img alt div
  • 《逆袭进大厂》 C++ 八股文问题目录

    如果有没看过前两期的小伙伴们可以点击下面两篇文章去温习一下 逆袭进大厂 之C 篇49问49答 绝对的干货 逆袭进大厂 第二弹之C 进阶篇59问59答 4W字超强汇总 知乎 逆袭进大厂 第三弹之C 提高篇79问79答 知乎 不逼逼了 逆袭进大
  • 解决 mac zsh 所有命令失效

    https www cnblogs com zhangrunhao p 9970656 html
  • Python - 使用多处理并行处理受 CPU 限制的任务

    多元处理 英语 Multiprocessing 也译为多进程 多处理器处理 多重处理 指在一个单一电脑系统中 使用二个或二个以上的中央处理器 以及能够将计算工作分配给这些处理器 拥有这个能力的电脑系统 也被称为是多元处理器系统 Multip
  • 如何克隆一个虚拟机/如何把虚拟机克隆一份给别人用/虚拟机互相通信

    https blog csdn net csdnliuxin123524 article details 80641649 https blog csdn net qq 42774325 article details 81189033 h
  • sqil-labs LESS5报错注入通关教程

    Less 5 报错注入 id 1 页面有回显 第一步 判断注入类型是数字型还是字符型 id 1 出现报错为 1 LIMIT 0 1 可判断为字符型且为单引号闭合 报错里面有数字 第二 判断字段数 使用order by order by 3时
  • JDBC 连接 DB2 的一个简单示例

    一 先贴上代码 后作解释 java源代码 public void getConnect Connection conn null PreparedStatement ps null ResultSet rs null try Class f
  • java多线程保证顺序执行

    前言 举例说明 比如要去冰箱里面拿牛奶 那么正常步骤是这样的 1 打开冰箱 2 拿出牛奶 3 关上冰箱 代码实现是这样的 public static void main String args Thread A new Thread new
  • Python-OpenCV 处理图像(一):基本操作

    0x00 图片读 写和显示操作 安装好 OpenCV 之后 首先尝试加载一张最简单的图片并显示出来 代码示例 第一种方式使用cv2 cv的LoadImage ShowImage和SaveImage函数 import cv2 cv as cv