Opencv笔记(二):图像的基本操作——续写
1.图像的透视变换
对于视角变换,我们需要一个 3x3 变换矩阵。在变换前后直线还是直线。要构建这个变换矩阵,你需要在输入图像上找 4 个点,以及他们在输出图像上对应的位置。这四个点中的任意三个都不能共线。这个变换矩阵可以有函数 cv2.getPerspectiveTransform() 构建。然后把这个矩阵传给函数cv2.warpPerspective。
import cv2
import numpy as np
img = cv2.imread('/home/wl/wyg.jpg',0)#以灰度图读入
rows,cols=img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(1000,1000))
cv2.imshow('opencv',dst)
cv2.imwrite('/home/wl/1.jpg',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.转换颜色空间
我们常用的图片颜色空间是BGR,但有时也会用到Gray、HSV、CMY等颜色空间。不同的颜色空间有着自己的特点,所以对于图片的颜色空间转换就变的尤为重要。在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。
import cv2
img = cv2.imread('/home/wl/wyg.jpg',1);
res = cv2.resize(img,None,fx=0.2,fy=0.2,interpolation= cv2.INTER_CUBIC )
res = cv2.cvtColor(res,cv2.COLOR_BGR2HSV )#转为HSV颜色空间
cv2.imshow('opencv',res)
cv2.imwrite('/home/wl/1.jpg',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.cvtColor(input_image那话mage,flag)函数可以转换颜色空间,第一个参数是抓要转换颜色空间的对象,第二个参数决定转换的类型。如BGR->GRA就可以设置为cv2.COLOR_BGR2GRAY、BGR—>HSV就可以设置为cv2.COLOR_BGR2HSV
3.拆分及合并图像通道
有时我们需要对 BGR 三个通道分别进行操作。这是你就需要把 BGR 拆分成单个通道。有时你需要把独立通道的图片合并成一个 BGR 图像。你可以这样做:
import cv2
import numpy as np
img = cv2.imread('/home/wl/wyg.jpg',1)
b,g,r = cv2.split(img)
cv2.imshow('blue',b)#cv2.imshow('red',r) and cv2.imshow('green',g)
cv2.imwrite('/home/wl/1.jpg',b)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.split(input_image)可以将BGR拆成三个单通道。下面三个图片分别是三个通道对应的b、g、r。所以可以看出这也是将图像灰度化处理的一种方式。
img=cv2.merge((b,g,r))
- cv2.merge()可以将多个单通道合并,但不能合并多个多通道。
我们想象中的拆开的红色通道应该是红色的,蓝色通道是蓝色的,但却变成了灰度图。事实上,单通道的都是灰度图,而所谓的都变成红色只是除了红色通道外,其他的通道的值都为0。下面利用numpy实现:
import cv2
import numpy as np
img = cv2.imread('/home/wl/wyg.jpg',1)
b,g,r = cv2.split(img)
zeros =np.zeros(img.shape[:2],res.dtype)
res = cv2.merge((b,zeros,zeros))#cv2.merge((zeros,g,zeros)) or cv2.merge((zeros,zeros,r))
cv2.imshow('blue',res)
cv2.imwrite('/home/wl/1.jpg',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.图像扩边
如果你想在图像周围创建一个边,就像相框一样,你可以使用 cv2.copyMakeBorder()函数。这经常在卷积运算或 0 填充时被用到。
import cv2
import numpy as np
img = cv2.imread('/home/wl/wyg.jpg',1)
BLUE = [255,0,0]
df=cv2.copyMakeBorder(img,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
cv2.imshow('blue',df)
cv2.imwrite('/home/wl/1.jpg',df),
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.copyMakeBorder(input_image,top, bottom, left, right,borderType),第二到第五参数为上下左右边界的像素数目,第五个参数是边界类型,常用的有如下几种类型:
——cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要下一个参数(value)。
——cv2.BORDER_REFLECT 边界元素的镜像。
——cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT跟上面一样,但稍作改动。
——cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa|abcdefgh|hhhhhhh
第一种类型:
import cv2
import numpy as np
img = cv2.imread('6_by_6.bmp', 0) print(img)
cons =cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=0) print(cons)
第二种镜像类型:
default = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
print(default)
Opencv笔记(二):图像的基本操作——续写的更多相关文章
- OpenCV学习笔记(3)——图像的基本操作
获取图像的像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 1.获取并修改像素值 先读入图像装入一个图像实体,然后该实体相当于一个多维list,可以直接用数组操作提取像素信 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
- Python下opencv使用笔记(图像频域滤波与傅里叶变换)
Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654 收藏 展开 本文转载自 https://blog ...
- opencv笔记2:图像ROI
time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- Elasticsearch笔记二之Curl工具基本操作
Elasticsearch笔记二之Curl工具基本操作 简介: Curl工具是一种可以在命令行访问url的工具,支持get和post请求方式.-X指定http请求的方法,-d指定要传输的数据. 创建索 ...
- Java_IO_文件的续写_小笔记
package IO; import java.io.FileWriter; import java.io.IOException; class FileWrite_WenJianXuXie { /* ...
- opencv入门系列教学(五)图像的基本操作(像素值、属性、ROI和边框)
0.序言 每个图像是由一个个点组成的,而这些点可以表示为像素值的形式. 这篇博客里我们将学会: 访问像素值并修改它们 . 访问图像属性 . 设置感兴趣区域(ROI) . 分割和合并图像. 对于图像的基 ...
- opencv笔记6:角点检测
time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
随机推荐
- Ajax校验用户名是否可用
准备 导包:DBUtil,JDBC,C3P0 在src下导入c3p0-config.xml 导入JDBCUtil 创建数据库 第2.3.条查看https://blog.csdn.net/weixin_ ...
- 安装postgresql后找不到服务 postgresql service
问题再现 环境: postgresql: 11.5 windows 10 企业版LTSC 64位 使用postgresql-11.5-1-windows-x64.exe安装后,让重新启动,但是重启后, ...
- MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信
服务器端发送数据给客户端 先看服务器端: CAsyncSocket m_sockSend; //声明一个Socket对象 点击发送数据后,执行下面这些动作 ...
- CSS行间样式与内部样式
注释 <!-- --> 快捷键 crtl+/ div 双标签<div></div> CSS语法 属性名:属性值: Css引入方式 1.行间样式的引入:在标签中 ...
- Python说文解字_Python之多任务_04
问:并发.并行.同步.异步.阻塞.非阻塞 答: 并发.并行: 并发是指一个时间段内(不是指的时间点),有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行.对人类的时钟来说1秒钟能干 ...
- Java连载70-冒泡算法、选择算法
一.冒泡排序 1.也就是依次选出最大的放在最后面 package com.bjpowernode.java_learning; public class D70_1_BubbleSort { pu ...
- 从认证到调度,K8s 集群上运行的小程序到底经历了什么?
导读:不知道大家有没有意识到一个现实:大部分时候,我们已经不像以前一样,通过命令行,或者可视窗口来使用一个系统了. 前言 现在我们上微博.或者网购,操作的其实不是眼前这台设备,而是一个又一个集群.通常 ...
- windows下使用mysqlbinlog做数据恢复时出现mysqlbinlog: File 'D:\MariaDB' not found (Errcode: 2)
出现如下这种情况是因为为找到bin-log日志,但为什么没有查到了??? 从图中可以看出系统只到到了D:\MariaDB但路径并没有查全,默认在windows下是以空格为分隔符的,所以他把D:\Mar ...
- UML-架构分析-步骤
1.识别->因素表 2.解决->技术备忘录 1).可靠性 2).法律问题 3).可适应性
- JavaScript—面向对象 贪吃蛇_2 游戏对象
游戏对象 function Game(map) { this.map = map; this.food = new Food(this.map) this.snake = new Snake(this ...