一、必备前提:

Python3.5及以上版本、pip、windows环境

二、搭建opencv

该部分可以创建隔绝的Python环境来引入,参照virtualenv的使用

在目标的cmd窗口,依次输入以下命令:

pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python

如果下载中间出现error或wrong,重新输入命令即可。

如果多次下载失败,可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/直接下载whl包安装,安装whl包依然使用pip

pip install 包的位置(如:C:\download\xxx.whl)

三、示例代码

读入图片:

cv.imread(filepath,flags)

filepath:要读入图片的完整路径
flags:读入图片的标志 
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道(1)
cv2.IMREAD_GRAYSCALE:读入灰度图片(0)
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道(-1)

支持 bmp、jpg、png、tiff 等常用格式,详情可以查看imread()方法的文档注释

显示图片:

cv.imshow('image',img)
cv.waitKey()
cv.destroyAllWindows()#cv.destroyWindow(wname)

cv2.imshow(wname,img)显示图像,第一个参数是显示图像的窗口的名字,第二个参数是要显示的图像(imread读入的图像),窗口大小自动调整为图片大小

cv2.waitKey顾名思义等待键盘输入,单位为毫秒,即等待指定的毫秒数看是否有键盘输入,若在等待时间内按下任意键则返回按键的ASCII码,程序继续运行。若没有按下任何键,超时后返回-1。参数为0表示无限等待。不调用waitKey的话,窗口会一闪而逝,看不到显示的图片。

cv2.destroyAllWindow()销毁所有窗口
cv2.destroyWindow(wname)销毁指定窗口

保存图片:

cv2.imwrite(file,img,num)

第一个参数是要保存的文件名,保存支持格式同读取,按需保存
第二个参数是要保存的图像。
可选的第三个参数,它针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别。默认为3.

cv2.IMWRITE_JPEG_QUALITY类型为 long ,必须转换成 int 
cv2.IMWRITE_PNG_COMPRESSION, 从0到9 压缩级别越高图像越小。

cv2.imwrite('1.jpeg',img, [int( cv2.IMWRITE_JPEG_QUALITY), ])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), ])

此处需注意,按照默认质量保存图片为JPEG files(\*.jpeg, \*.jpe, \*.jpg)时,由于jpeg压缩版本在压缩过程中导致了部分像素丢失,会导致保存后的像素点值与写入前有差别。

保存图片为png格式,即可以解决此问题

示例代码:读入一副图像,按’s’键保存后退出,其它任意键则直接退出不保存

import cv2 as cv
img = cv.imread('D:\python\test.jpg',cv2.IMREAD_UNCHANGED)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == ord('s'):
# wait for 's' key to save and exit
cv.imwrite('1.png',img)
cv.destroyAllWindows()
else:
cv.destroyAllWindows()

四、图像的基本操作

创建图片

1.创建三通道

import numpy as np
import cv2 as cv # 三通道
creat_img3 = np.zeros([400, 400, 3], np.uint8) # 高400*宽400*通道3 单通道8位
creat_img3[:, :, 0] = np.ones([400, 400]) * 255 # 0(Blue)通道全部赋值255
creat_img3[:, :, 2] = np.ones([400, 400]) * 255 # 2(Red)通道全部赋值255
cv.imshow("create image3", creat_img3)

2.创建单通道

# 单通道
creat_img1 = np.zeros([400, 400, 1], np.uint8)
creat_img1[:, :, 0] = np.ones([400, 400]) * 127 # 单通道灰度图像
cv.imshow("create image1", creat_img1)

3.创建小尺寸

# 生成小尺寸图片
mini_img = np.ones([3, 3], np.float)
mini_img.fill(127.1) # .fill方法填充数据
mini_img2 = mini_img.reshape([1, 9]) # reshape只改变形状,不改变数据
print(mini_img, mini_img2)

以上内容摘自:https://blog.csdn.net/l0ve777/article/details/88715704

读取图片并编辑

import cv2 as cv

img = cv.imread("D://test.jpeg")
#对 BGR 图像而言,返回值为 B, G, R 的值,对灰度图像而言,会返回他的灰度值。即彩图返回三通道三维数组,灰度图返回单通道三维数组,小图返回二维数组
print(img[100,100]) #[ 42 57 130]
print(img.item(100,100,2)) #
img.itemset((100,100,2),25) #img[100,100,2]=25
print(img.item(100,100,2)) #

获取图像属性

import cv2 as cv

img = cv.imread("D://test.jpeg")
# img.shape 可以获取图像的形状。他的返回值是一个包含行数,列数,通道数的元组。行数对应坐标轴上的y轴,即高度;而列数对应x轴,即宽度。返回值可以理解为高度,宽度,通道数。
print(img.shape) #(512, 512, 3)
# img.size 可以返回图像的像素数目。
print(img.size) #
#img.dtype 返回的是图像的数据类型。
print(img.dtype) #uint8

设置ROI

ROI(Region of Interest)是指图像中的一个矩形区域,如果后续需要单独处理某一个小区域,可以设置ROI

import cv2 as cv

ballImg = img[380:512,230:350]   #利用numpy中的数组切片设置ROI区域
img[0:132,0:120] = ballImg #将设置的ROI区域添加到原图像的左上方 cv.namedWindow("Image")
cv.imshow("Image", img)
cv.waitKey(0)

拆分及合并图像通道

要对单个通道进行操作的时候,需要拆分出单个通道,有2种方法

1)用opencv自带的split函数

保存图片

需注意按照需要,保存不同格式

 mini_img = np.ones([3, 3], np.uint8)
mini_img.fill(127) # .fill方法填充数据
#mini_img2 = mini_img.reshape([1, 9]) # reshape只改变形状,不改变数据
#print(mini_img, mini_img2)
print(mini_img)
cv.imshow("mini_img", mini_img)
cv.waitKey(0) #毫秒级,0为无限等待
cv.imwrite('mini.jpg', mini_img) image = cv.imread('mini.jpg',0) #0表示灰度图
print(image) image[0][0] = 100 #image.itemset(0,100)
image[1][0] = 40 #image.itemset((1,0),40)
cv.imshow("mini_img", image)
cv.waitKey(0)
cv.imwrite('mini2.jpg', image) image = cv.imread('mini2.jpg',0)
print(image)

以上三处打印分别为:

[[127 127 127]
[127 127 127]
[127 127 127]] [[127 127 127]
[127 127 127]
[127 127 127]] [[100 126 125]
[ 39 131 127]
[128 127 124]]

发现,为灰度图(即像素数相同,为127)时,读图数据与写入一致,但是当改变了其中某些像素值后,读图数据发生了变化,

是由于jpeg压缩版本在压缩过程中导致了部分像素丢失,保存图片为tif格式或者png格式,即可以解决此问题

cv.imwrite('mini2.png', image)

image = cv.imread('mini2.png',0)

python3+Opencv 搭建环境和基本操作的更多相关文章

  1. Android下OpenCV的环境搭建

    目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基 ...

  2. Qt+MinGW+OpenCV开发环境在win7系统下的搭建(最新20140423)

    1 搭建环境 (1)联想Y470笔记本电脑,win7操作系统 (2)Qt 5.2.1 Open Source :(Qt Online installer for Window(9MB),即下载页面最上 ...

  3. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

  4. Qt_mingw搭建opencv开发环境

    Qt在windows下共有2个版本:mingw和msvc.其中mingw使用gcc编译器,msvc使用微软的VC编译器.针对不同版本Qt,使用Opencv的方式也不同. 区别 msvc, 可以使用op ...

  5. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

  6. IntelliJ OpenCV 开发环境搭建

    Windows下的IntelliJ + OpenCV开发环境搭建 基于IntelliJ IDEA 15 和 OpenCV 3.1.0 1. 在OpenCV官网下载OpenCV安装程序,双击解压到目标目 ...

  7. Zynq7000开发系列-5(OpenCV开发环境搭建:Ubuntu、Zynq)

    操作系统:Ubuntu14.04.5 LTS 64bit OpenCV:OpenCV 3.1.0.opencv_contrib gcc:gcc version 4.8.4 (Ubuntu 4.8.4- ...

  8. 001——搭建OpenCV实验环境

    开发环境 VS 2017 15.7.6 OpenCV 3.4.1 搭建环境 设置环境变量 创建Win32 空项目 配置属性管理器 测试代码 #include<opencv2/opencv.hpp ...

  9. 【OpenCV】 在CentOS下搭建OpenCV开发环境

    最近开始入模式识别的坑,自然被迫上OpenCV了. 在多次尝试给VS2015扩展Windows 10 SDK无果后(不要问我为啥..VS2015开发C++的标准库全给扔到这个SDK里了,打包在VS安装 ...

随机推荐

  1. 你必须知道的.Net 8.4.4 位枚举

    位标记集合是一种由组合出现的元素形成的列表,通常设计为以“位或”运算组合新值:枚举 类型则通常表达一种语义相对独立的数值集合.而以枚举类型来实现位标记集合是最为完美的组 合,简称为位枚举.在.NET ...

  2. 小程序包大小超过2M的解决方法

    小程序的包被限制在2M以下, 超出的时候点击预览, 发现报错: Error: 代码包大小为 3701 kb,上限为 2048 kb,请删除文件后重试 1. 优化代码, 删除掉不用的代码 2. 图片压缩 ...

  3. Swift 语法糖then

    then是一个swift初始化库,只有80几行的代码库,确可以让初始化变得很优雅. 1.使用then初始化AnyObject,这里以初始化控件为例 lazy var label = UILabel() ...

  4. 新手小白如何向GitHub上提交项目

    首先你得注册一个自己的GitHub账号,注册网址:https://github.com/join 创建一个新的项目,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上 ...

  5. 关于Android 的内存泄露及分析(转)

    一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...

  6. Spark Scheduler 模块(上)

    在阅读 Spark 源代码的过程中,发现单步调试并不能很好的帮助理解程序.这样的多线程的分布式系统,更好的阅读源代码的方式是依据模块,分别理解.   在包 org.apache.spark 下面有很多 ...

  7. 剑指offer自学系列(五)

    题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  8. python --- unittest如何传cookies

    1. #将CookieJar转为字典: cookies = requests.utils.dict_from_cookiejar(r.cookies) #将字典转为CookieJar: cookies ...

  9. STL语句表跳转指令学习

    打开语句表程序状态监控 发现 被跳过的指令用普通字体显示 被执行的指令用加粗的字体表示 录制成视频 如果除数是0 发生了溢出 用 JUO 跳转指令,跳转到 M001 例程已经录制成视频 上传到百度网盘 ...

  10. UVA - 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)

    题意:问使天平平衡需要改动的最少的叶子结点重量的个数. 分析:天平达到平衡总会有个重量,这个重量可以由某个叶子结点的重量和深度直接决定. 如下例子: 假设根结点深度为0,结点6深度为1,若以该结点为基 ...