opencv基础教程 之 图像基础和绘图
1,教程:感谢小强
2,用argparse传参数来显示一张图片
- #!/usr/bin/python #linux系统
- #coding=utf-8
- import cv2
- import argparse #python很常用的一个自带包
- ap=argparse.ArgumentParser() #先实例化一个argparse
- ap.add_argument("--image","-i",required=True,help="path to the image") #调用argparse下的一个方法,这样我们就可以告诉程序,我们后面输入的参数是个什么参数,参数是:标签全称,简称,参数是不是必须的(required),action=“function”(可选参数),help:显示帮助信息
- args=vars(ap.parse_args()) #参数名和内容的键值对字典,这个直接记住吧,估计是让参数名和参数的实际值形成了一个字典,字典名字叫args
- image=cv2.imread(args["image"])
- print "height",image.shape[0],"px"
- print "width",image.shape[1],"px"
- print "channels",image.shape[2]
- cv2.imshow("image",image) #图像显示出来
- image[0:5,0:5,]=(0,0,255) #把图像y轴上0-5,x轴上0-5的像素变成红色,打印出来
cv2.imshow("color",image)
(h,w)=image.shape[:2]
(cx,cy)=(w/2,h/2) #图像中心点
t1=image[0:cy,0:cx] #截取左上角的pic
cv2.imshow("part1",t1)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
3,opencv绘图
- #!/usr/bin/python
- #!coding=utf-8
- import numpy as np
- import cv2
- # 初始化一块400*600的画布(相当于生成一个numpy数组,也就是一幅图像),注意这里的画布是三通道的,也就是彩色图像
- canvas = np.zeros((400, 600, 3), dtype="uint8") #注意400是高度y轴,600是宽度
- # 画一条绿线
- green = (0, 255, 0)
- # 起点(0, 0)至终点(600, 400),颜色绿色。PS.这里有一个默认参数,线宽默认为1个像素
- cv2.line(canvas, (0, 0), (600, 400), green,4) #画布,开始坐标,终点坐标,线的颜色和线的粗细
- cv2.imshow("Canvas", canvas) #显示出来瞅瞅
- cv2.waitKey(0)
- cv2.rectangle(canvas,(0,0),(15,150),green,1) #画矩形的函数:rectangle,需要的是指定原点(矩形的左上角)和矩形的水平宽度和高度,往后是线条颜色 和宽度,注意宽度是-1的时候表示填充
cv2.imshow("Canvas", canvas) #显示出来瞅瞅
cv2.waitKey(0)
cv2.circle(canvas,(100,150),50,(255,255,255)) #画一个圆形,圆心坐标(x,y),半径50,颜色(255,255,255,)白色
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)
4,基础图像操作
- 1 #!/usr/bin/python
- 2 #coding=utf-8
- 3
- 4 import sys
- 5 import cv2
- 6
- 7 import numpy as np
- 8
- 9 input_file=sys.argv[1]
- 10 img=cv2.imread(input_file)
- 11 cv2.imshow('original',img)
- 12
- 13 #裁剪图像,对shape函数不甚理解
- 14 h,w=img.shape[:2]
- 15 start_row,end_row=int(0.21*h),int(0.73*h)
- 16 start_col,end_col=int(0.37*w),int(0.92*w)
- 17 img_cro=img[start_row:end_row,start_col:end_col]
- 18 cv2.imshow('img_cro',img_cro)
- 19
- 20 #把图像的长宽都乘以1.3,对热死则函数和参数不甚理解
- 21 scaling_factor=1.3
- 22 img_scaled=cv2.resize(img,None,fx=scaling_factor,fy=scaling_factor,interpolation=cv2.INTER_LINEAR)
- 23 cv2.imshow('scaled',img_scaled)
- 24
- 25 #把图像变扁
- 26 img_scaled=cv2.resize(img,(250,400),interpolation=cv2.INTER_AREA)
- 27 cv2.imshow("skewe",img_scaled)
- 28 cv2.waitKey()
- 29
- 30 #图像保存到输出文件
- 31 output_file=input_file[:4]+'__cropped.jpg'
- 32 cv2.imwrite(output_file,img_cropped)
- 33
- 34 cv2.waitKey()
5,图像直方图均衡化
目前不甚理解
- #!user/bin/python
- #!coding=utf-8
- import sys
- import cv2
- import numpy as np
- input_file=sys.argv[1]
- img=cv2.imread(input_file)
- img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- cv2.imshow("gray",img_gray) #显示原图的灰度图
- #均衡灰度直方图
- img_gray_histeq=cv2.equalizeHist(img_gray)
- cv2.imshow('equlized',img_gray_histeq) #不仅是灰色的,而且像是锐化过了,像素差别被增强了
- #目前直方图均衡化只适合亮度通道,所以彩色的图在均衡化之前需要转换到YUV色彩空间
- img_yuv=cv2.cvtColor(img,cv2.COLOR_BGR2YUV)
- #均衡y通道,感觉转换的是red通道
- img_yuv[:,:,0]=cv2.equalizeHist(img_yuv[:,:,0])
- #转换回bgr
- img_histeq=cv2.cvtColor(img_yuv,cv2.COLOR_YUV2BGR)
- cv2.imshow('input',img) #这个是原图
- cv2.imshow('histeq',img_histeq) #这个图感觉颜色被加深了,就是img_gray_histeq图带了颜色
- cv2.waitKey()
opencv基础教程 之 图像基础和绘图的更多相关文章
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
- Java基础教程:多线程基础(1)——基础操作
Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- Java基础教程:多线程基础(4)——Lock的使用
Java基础教程:多线程基础(4)——Lock的使用 快速开始 Java 5中Lock对象的也能实现同步的效果,而且在使用上更加方便. 本节重点的2个知识点是:ReentrantLock类的使用和Re ...
- Java基础教程:多线程基础(2)——线程间的通信
Java基础教程:多线程基础(2)——线程间的通信 使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督. 线程间的通信 ...
- Java基础教程:多线程基础——线程池
Java基础教程:多线程基础——线程池 线程池 在正常负载的情况瞎,通过为每一个请求创建一个新的线程来提供服务,从而实现更高的响应性. new Thread(runnable).start() 在生产 ...
- Java基础教程:多线程基础(6)——信号量(Semaphore)
Java基础教程:多线程基础(6)——信号量(Semaphore) 信号量 信号量(Semaphore)由一个值和一个指针组成,指针指向等待该信号量的进程.信号量的值表示相应资源的使用情况.信号量S≥ ...
- Java基础教程:多线程基础(5)——倒计时器(CountDownLatch)
Java基础教程:多线程基础(5)——倒计时器(CountDownLatch) 引入倒计时器 在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种 ...
- Java基础教程:多线程基础(3)——阻塞队列
Java基础教程:多线程基础(3)——阻塞队列 快速开始 引入问题 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据. 模 ...
随机推荐
- uWSGI、WSGI、uwsgi是什么?
uWSGI是一个web服务器,它实现了WSGI协议.uwsgi协议.HTTP等协议: WSGI是web服务器网管接口,是一套协议,用于接收用户请求并将请求进行初次封装,然后交给web框架: uwsgi ...
- scala的多种集合的使用(5)之数组Array(ArrayBuffer)的操作
1.创建和更新数组的不同方式 1)定义一个数组的初始大小和类型,随后填充值. scala> val array = new Array[String](3) array: Array[Strin ...
- Ceva定理的四种证明方法
${\color{Teal} {Ceva定理}}$设$D.E.F$依次为三角形ABC的边$AB.BC.CA$的内点,记 $λ$=(A,B,D),$μ$=(B,C,E),$v$=(C,A,F) 求证:三 ...
- React Fullpage
之前项目需要,单独拿出来做了个demo 目前仅支持收尾加autoheight github地址:https://github.com/zlinggnilz/React-Fullpage
- Markdown基础语法小结
一.前言 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. --摘自百度百科 没想到一向不太靠谱的百度百科这次竟有了如此精辟的解释. ...
- PHP Yii2 composer环境安装
PHP Yii2 composer环境安装 composer 安装 任意目录执行: php -r "copy('https://install.phpcomposer.com/install ...
- python3 while-else和for-else语法
while-else: while判断条件不成立时,执行else语句: 语法: while 判断条件: 语句1.... else: 语句2.... i初始值为2,i>0成立,则执行while语句 ...
- CF350E 【Wrong Floyd】
Description 给定n个点,m条边,k个标记点,hack掉给出的程序. Solution 先考虑不可能hack掉的情况.当所有点都是标记点的时候肯定不能hack掉,也就是\(n=k\).还有就 ...
- winform项目导入数据
一.点击导入按钮,弹出文件选择框 这个方法的使用要引用下面两个命名空间: using System.Windows.Forms;using DevExpress.XtraEditors; privat ...
- 什么是SerDes,serializer/deserializer?
序列化器与反序列化器(SerDes,serializer/deserializer)是一种进行串行数据和并行数据相互转换的收发集成电路(IC).发送器部分是一个串行到并行的转换器,接收器部分是一个并行 ...