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:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...
 
随机推荐
- 强制浏览器以IE8版本运行
			
做为一个开发人员,经常被要求前端页面兼容ie8及以上,所以有时候我们希望ie默认以ie8的版本打开我们的页面. 1.“文档模式”: 在html页面中加入类似下面的代码: <meta http-e ...
 - Sequence Models Week 1 Character level language model - Dinosaurus land
			
Character level language model - Dinosaurus land Welcome to Dinosaurus Island! 65 million years ago, ...
 - 【Linux】linux磁盘管理
			
在服务器管理中,我们会关心硬盘用了多少,还有多少剩余空间,哪些文件占用空间最大等等.以便我们在合适的时机为服务器添加硬盘分区以及管理磁盘文件等操作,让磁盘的利用率最大化,现在我们看下linux系统中和 ...
 - VMWare WorkStation15--Win10下开机启动虚拟机
			
参考 https://www.cnblogs.com/qmfsun/p/6284236.html http://www.cnblogs.com/eliteboy/p/7838091.html VMWa ...
 - Keras + Flask 提供接口服务的坑~~~
			
最近在搞Keras,训练完的模型要提供个预测服务出来.就想了个办法,通过Flask提供一个http服务,后来发现也能正常跑,但是每次预测都需要加载模型,效率非常低. 然后就把模型加载到全局,每次要用的 ...
 - java 继承条件下的构造方法调用
			
运行 TestInherits.java示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第 ...
 - 算概率(dp,数论)
			
链接:https://ac.nowcoder.com/acm/contest/3003/C来源:牛客网 题目描述 牛牛刚刚考完了期末,尽管牛牛做答了所有 n 道题目,但他不知道有多少题是正确的. 不过 ...
 - Z0J 3772 Calculate the Function 线段树+矩阵
			
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235 这种题目居然没想到,一开始往矩阵快速幂想去了,因为之前跪了太多矩阵快速幂 ...
 - ZOJ 3757 Alice and Bod 模拟
			
上次的ZJU月赛题,规则比较复杂,当时就连题意都没摸清楚,只觉得非常复杂 比完后敲啊敲啊敲,连续WA啊,该反思下自己,没按照题意来设置条件,题目中说了 白球入袋并且... 给对手加分 ,白球未入袋并且 ...
 - delphi try except与try finally语句用法以及区别
			
一.异常的来源 在Delphi的应用程序中,下列的情况都比较有可能产生异常. (1)文件处理 (2)内存分配 (3)Windows资源 (4)运行时创建对象和窗体 (5)硬件和操作系统冲突 二.异常的 ...