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

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 cv2img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:         # wait for ESC key to exitcv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exitcv2.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 cvimage=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the imagefont = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a fonty = image.height / 2 # y position of the text
x = image.width / 4 # x position of the textcv.PutText(image,"Hello World !", (x,y),font, cv.RGB(255, 255, 255)) #Draw the textcv.ShowImage('Hello World', image) #Show the imagecv.WaitKey(0)

cv2:

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

0x03. 缩放图片

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

import cv2.cv as cvim = cv.LoadImage("img/alkaline.jpg") #get the imagethumb = cv.CreateImage((im.width / 2, im.height / 2), 8, 3) #Create an image that is twice smaller than the originalcv.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)#ORheight, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

0x04. 图像平移

import cv2
import numpy as npimg = cv2.imread('messi5.jpg',0)
rows,cols = img.shapeM = 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.shapeM = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

0x06. 仿射变换

import cv2
import numpy as npimg = cv2.imread('mao.jpg')
rows,cols,ch = img.shapepts1 = 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 npcap = 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) & 0xFFif k == 27:breakcv2.destroyAllWindows()

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

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

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

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

cv2.cv

import cv2.cv as cvorig = 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 npBLUE = [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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言fscanf函数了解

fscanf函数从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。 原型:int fscanf(FILE *stream, char *format,[argument...]); 返回值:返回实际被转换并赋值的输入项…

linux下gcc编译使用opencv的源文件时报错的处理:undefined reference to symbol '_ZNSsD1Ev@@GLIBCXX_3.4'

这阵子用OpenCV的sift做了一下匹配,在使用gcc编译时遇到这样的一个报错 /usr/bin/ld: /tmp/cceCEx1F.o: undefined reference to symbol _ZNSsD1EvGLIBCXX_3.4 //usr/lib/x86_64-linux-gnu/libstdc.so.6: error adding symbols: DSO missing from command linecoll…

C语言fgets函数了解

原型是:char *fgets(char *s, int n, FILE *stream); 从文件指针stream中读取n-1个字符,存到以s为起始地址的空间里,直到读完一行,如果成功则返回s的指针,否则返回NULL。 例如:一个文件是hello,world&…

PCL PCD文件读写

/* 时隔一年&#xff0c;又回来做双目视觉方向&#xff0c;需要重新启航&#xff0c;加油&#xff01;&#xff01;&#xff01; */ #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main() { //----------------…

判断两颗棵二叉树是否相等

int CompTree(TreeNode *tree1, TreeNode *tree2) { bool isTree1Null (tree1 NULL); bool isTree2Null (tree2 NULL); //其中一个为NULL,而另一个不为NULL,肯定不相等 if (isTree1Null ! isTree2Null) return 1; //两个都为NULL,一定相等 if (isTree1Null && isTr…

sdut 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

第一次写BFS的题&#xff0c;从开始一脸懵逼到慢慢分析&#xff0c;期间没有看书没查博客&#xff0c;自己安静的做了四十分钟终于做出来了&#xff0c;满满的成就感&#xff0c;我很水&#xff0c;但是我很努力&#xff0c;Mr杰要努力&#xff01; #include<stdio.h> #i…

最简逆波兰模板

#include<iostream> #include<math.h> using namespace std; double exp() { char a[10]; scanf("%s",a);//注意scanf取入字符串遇到‘\0’停止 switch(a[0]){ case :return exp()exp(); case -:return exp()-exp(); case *:return exp()…

windows 静态IP设置

1.打开cmd&#xff0c;输入ipconfig 记录 IP address 子网掩码 网关 打开 wlan 属性 选中一个网络右键 “属性” 设置 ipv4&#xff0c;选择“使用下面的IP地址” 对应填写 ip地址 子网掩码 网关 tips&#xff1a;DNS建议和网关一样

算术表达式的前缀式、中缀式、后缀式相互转换

中缀表达式&#xff08;中缀记法&#xff09;中缀表达式是一种通用的算术或逻辑公式表示方法&#xff0c;操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。 虽然人的大脑很容易理解与分析中缀表达式&#xff0c;但对计算机来说中缀表达式却是很复杂的&…

sdut 二叉排序树

二叉排序树 Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic DiscussProblem Description 二叉排序树的定义是&#xff1a;或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点…

“CV_RGB2BGR”: 未声明的标识符

#include "opencv2/imgproc/types_c.h" 添加以上头文件

sdut 图的深度遍历

图的深度遍历Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic DiscussProblem Description请定一个无向图&#xff0c;顶点编号从0到n-1&#xff0c;用深度优先搜索(DFS)&#xff0c;遍历并输出。遍历时&#xff0c;先遍历节点编号小的。Input输入第一行为整数n&…

windows pytorch环境安装配置

1.下载anaconda windows版本下载地址

赫夫曼编码

http://blog.csdn.net/webzhuce/article/details/53105831

哈佛大学凌晨四点半

哈佛老师经常给学生这样的告诫&#xff1a;如果你想在进入社会后&#xff0c;在任何时候任何场合下都能得心应手并且得到应有的评价&#xff0c;那么你在哈佛的学习期间&#xff0c;就没有晒太阳的时间。作为闻名于世的学府&#xff0c;哈佛大学培养了许多名人&#xff0c;他们…

优先队列c++ STL用法

优先队列(priority queue)普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在优先队列中&#xff0c;元素被赋予优先级。当访问元素时&#xff0c;具有最高优先级的元素最先删除。优先队列具有最高级先出 &#xff08;first in, l…

window 远程linux

1.我们需要在Linux安装ssh服务 sudo apt-get install openssh-server 2.然后开启ssh服务 sudo /etc/init.d/ssh start 3.在window上安装PUTTY 下载网址 4.填写Linux ip 查看ip: 在Linux输入&#xff1a;ifconfig 5.然后填写登陆Linux的账户名和密码 大功告成。。。。。…

赫夫曼编码长度计算问题?

例题&#xff1a;一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符&#xff07;d&#xff07;的哈夫曼编码的长度为&#xff1f; 题解&#xff1a; 首先构造huffman树 每一步都将所有数字排序 方法如下: 1: 3 5 6 7 2: 6 7 8 / \ 3 5 3: 8 13 / \ / \ 3 5 6 7 4: 21 /…

windows + cmake + vs2019 编程

1.安装minGW64 2.安装cmake 3.安装vs2019 4.组建代码文件结构&#xff1a; 5.在build 文件下打开git bash&#xff0c;执行一下指令 cmake .. -G"Visual Studio 16 2019" tips( vs2017 对应 cmake .. -G"Visual Studio 15 2017" ) cmake 模板…

sdut 数据结构实验之二叉树六:哈夫曼编码

#include <iostream> #include <cstdio> #include <cstring> #include <queue>using namespace std;int main() {char s[10000];while(scanf("%s",s)!EOF){priority_queue < int,vector<int>,greater<int> > Q;//利用优先…