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:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
随机推荐
- 解决 .NET CORE3.0 MVC视图层不即时编译
微软官方文档 Razor 编译 Razor SDK 默认启用 Razor 文件的生成时和发布时编译. 启用后,运行时编译将补充生成时编译,允许更新 Razor 文件(如果对其进行编辑). 运行时编译 ...
- 直线电机设计与优化(TFLM,FSLM)论文阅读笔记3
2.21-(2.7论文引出)傅里叶对开关磁通电机建模 Modeling of Flux Switching Permanent Magnet Machines With Fourier Analysi ...
- mysql第四篇--SQL逻辑查询语句执行顺序
mysql第四篇--SQL逻辑查询语句执行顺序 一.SQL语句定义顺序 SELECT DISTINCT <select_list> FROM <left_table> < ...
- C++中substr()详解
#include<string> #include<iostream> using namespace std; int main() { string s("123 ...
- clion之CMakeLists的学习
什么是CMake CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的" ...
- UVA 11987 - Almost Union-Find 并查集的活用 id化查找
受教了,感谢玉斌大神的博客. 这道题最难的地方就是操作2,将一个集合中的一个点单独移到另一个集合,因为并查集的性质,如果该点本身作为root节点的话,怎么保证其他点不受影响. 玉斌大神的思路很厉害,受 ...
- 编写注册表.reg文件
Windows 中的注册表文件( system.dat 和 user.dat )是 Windows 的核心数据库,因此,对 Windows 来说是非常重要的. 通过修改注册表文件中的数据,可以达到优化 ...
- opencv摄像头捕获视频
1.ord()函数:它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 ...
- Mybatis之一级缓存(七)
1. 介绍 Mybatis缓存分为一级缓存和二级缓存,在本节中我们介绍下一级缓存的使用及其特性 MyBatis的一级缓存是在一个Session域内有效的,当Session关闭后,缓存内容也随之销毁.缓 ...
- HttpClient4.x 上传文件
https://blog.csdn.net/wsdtq123/article/details/78888734