OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCV-Python是OpenCV的Python的API接口,它拥有OpenCV C++ API的功能,同时也拥有Python语言的特性,可以做到跨平台使用。但值得注意的是在Python3(目前使用的是Python3.7)里对OpenCV-Python接口的中文支持并不是很友好。

安装:

sudo pip3 install opencv-python

直方图模块安装:

pip3 install matplotlib

简单的读取一张图片:

 import cv2 #导入opencv库

 #读取一张图片,地址不能带中文
imgviewx=cv2.imread("imgx/zcy.jpg") #创建一个窗口,中文显示会出乱码
cv2.namedWindow("东小东标题") #显示图片,参数:(窗口标识字符串,imread读入的图像)
cv2.imshow("东小东标题",imgviewx) #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0) #销毁窗口,退出程序
cv2.destroyAllWindows()

其它属性详细介绍:

 import cv2 #导入opencv库
import numpy as np #.........................................................................
#读取一张图片,地址不能带中文
'''
第二个参数,取值可为:
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
cv2.IMREAD_GRAYSCALE:读入灰度图片
cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道(png有,jpg无)
'''
#imgviewx=cv2.imread("imgx/wa.jpg")
imgviewx=cv2.imread("imgx/DONG.jpg",cv2.IMREAD_COLOR) #.........................................................................
#获取图片信息
#一个像素有三个通道,BGR
print(imgviewx.shape)#输出:(1080, 1920, 3) 高像素,宽像素,通道数
print(imgviewx.size)# 120000 总通道数=高* 宽* 通道数
print(imgviewx.dtype)# uint8 3个通道每个通道占的位数(8位,一个字节)
#print(imgviewx) #输出效果视乎与下条相同
#print(np.array(imgviewx)) #输出每个像素点的参数( B , G , R )
#获取图片 B G R 各均值, #(204.46305102040816, 208.50832244897958, 217.29540408163263, 0.0) ,红色部分最多
print(cv2.mean(imgviewx))
#获取方差,也会打印均值,可用均值方差都为零判断图片无效
#print(cv2.meanStdDev(imgviewx)) #.........................................................................
#图片处理
#备份图片
imgviewx1=imgviewx.copy() #均值模糊,主要用于去除图片噪点
#读取图片并实现图片的模糊效果,参数:(读取图片,(X轴方向模糊,Y轴方向模糊))
#imgviewx=cv2.blur(imgviewx,(5,5)) #中值模糊,主要用于去除椒盐(烧烤配料)噪点
#参数:(图片信息,模糊值)
#imgviewx=cv2.medianBlur(imgviewx,9) #普通高斯模糊
#参数:(图片信息,参数1,参数2)参数1和参数2只能设置一个
#imgviewx=cv2.GaussianBlur(imgviewx,(0,0),1) #保留边缘(像素差),高斯模糊
#参数(图片信息,0,要用怎样的方式(越大则越细),空间复杂度(越大越复杂))
imgviewx=cv2.bilateralFilter(imgviewx,0,50,6) #美颜,美白效果valuex值越大越白
#valuex=50;
#imgviewx=cv2.bilateralFilter(cv2.imread("imgx/zcy.jpg"),valuex,valuex * 2,valuex / 2) #对比度和亮度调整
#duix=0.5 #对比度
#lightx=0 #亮度
#imgviewx=cv2.addWeighted(imgviewx,duix,np.zeros(imgviewx.shape,imgviewx.dtype),1-duix,lightx) #显示文字
# 参数:图像,文字内容, 坐标( x , y ) ,字体,大小,颜色( B , G ,R ),字体厚度
#颜色值为0-255
font = cv2.FONT_HERSHEY_SIMPLEX # 定义字体
imgviewx = cv2.putText(imgviewx,"DONG XIAO DONG",(10, 50), font, 1.2, (0, 0, 255), 5) #像素取反
#imgviewx=cv2.bitwise_not(imgviewx) #遍历图片,效率低,不推荐使用
def xgtp():
global imgviewx
gx,kx,tx=imgviewx.shape#得到像素高度,像素宽度,通道数 for g in range(0,gx):
for k in range(0,kx): #这里得到的是每个像素点,每个点由RGB三色构成
if(k>0 and k<100):
imgviewx[g,k,0]=0 # B
imgviewx[g,k,1]=255 # G
imgviewx[g,k,2]=255 # R
else:
imgviewx[g, k, 0] = imgviewx[g, k, 0] #获取到原来的值
imgviewx[g, k, 1] = imgviewx[g, k, 1]
imgviewx[g, k, 2] = imgviewx[g, k, 2] #创建一个图形,使用np,所以效率高
def cjtx():
# 初始化像素点值全为0 (rgb都为零,所以是黑色)
#参数:([高,宽,通道数],每个通道占的位数(一个字节))
imgx=np.zeros([400,600,3],np.uint8) #初始化像素点值为全为1
#imgx[110:130,50:70,2]表示一个范围:[高度起始点:高度结束点,宽度起始点:宽度结束点,哪个通道],起始点均以左上角
#imgx[:,:,0]=np.ones([400,600],np.uint8)*255 #最终结果为第一个通道(B)全为255,所以是蓝色
imgx[110:130,50:70,1]=np.ones([20,20],np.uint8)*255
cv2.imshow("第二个图形窗口",imgx) #图片区域处理
def pictureArea():
global imgviewx
#得到截图
areax=imgviewx[110:529,778:1200]
#将图片由RGB(3通道)转换为灰度(2通道)
areax=cv2.cvtColor(areax,cv2.COLOR_BGR2GRAY)
#将图片有2通道还原成3通道,但色彩不能还原
areax2=cv2.cvtColor(areax,cv2.COLOR_GRAY2RGB)
#处理后的区域写到原图上
imgviewx[110:529, 778:1200]=areax2
#显示截图
cv2.imshow("area",areax) #泛洪填充,相似像素填充
def fill_color():
global imgviewx
h,w,t=imgviewx.shape
#必要参数
maskx=np.zeros([h+2,w+2],np.uint8)
#参数接收:(图片信息,必要参数,参考点位置坐标,填充的颜色,查找范围:最低像素(参考减所写),查找范围:最高像素(参考加所写),全部填充)
cv2.floodFill(imgviewx,maskx,(100,100),(0,255,0),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE) #通道分离与合并
def tongdao():
global imgviewx
b,g,r=cv2.split(imgviewx)#通道分离
cv2.imshow("bb",b)#通道图单独显示
cv2.imshow("gg",g)
cv2.imshow("rr",r) imgviewx[:,:,1]=135 #改变单个通道(0,1,2 => B,G,R)
cv2.imshow("chang red ",imgviewx) imgviewx=cv2.merge([b,g,r])#合并通道 #像素运算
def pixel_operation():
#读入两张大小和通道相同的图片
img1=cv2.imread("imgx/img1.jpg")
img2=cv2.imread("imgx/img2.jpg")
print(img1.shape, "=====", img2.shape)
# 创建一个大小可调整的窗口
cv2.namedWindow("operation", cv2.WINDOW_NORMAL)
cv2.imshow("img111", img1)
cv2.imshow("img222",img2)
#处理图片
#像素点相加,如0(黑色),255(白色),0+255=255(白色),超过255还是白色
#imgoperation=cv2.add(img1,img2)
#像素相减,如0(黑色),255(白色),0-255=-255=0(黑色)
#imgoperation=cv2.subtract(img1,img2)
#像素相乘,255(白色),0/255=0(黑色)
#imgoperation=cv2.divide(img1,img2)
#像素相乘,255(白色),0*255=0(黑色)
#imgoperation=cv2.multiply(img2,img1)
#像素与,二进制与,如0与255为00000000&11111111=00000000
imgoperation=cv2.bitwise_and(img1,img2)
#像素或
imgoperation=cv2.bitwise_or(img1,img2) #显示处理后的图片
cv2.imshow("operation", imgoperation) #.......................................................................
#视频处理,视频无声音
def vediox():
ved=cv2.VideoCapture("imgx/vv.mp4")#打开视频
while True:
ret,tux=ved.read()
if ret== False:#判断视频是否播放完毕
break
else:
cv2.imshow("wideo1111",tux)#每帧显示
hsv=cv2.cvtColor(tux,cv2.COLOR_BGR2HSV)#转换成HSV图片格式,对颜色敏感
lowx=np.array([37,43,46])#表格在后面给出
uppx=np.array([77,255,255])
# 播放此输出的目标是白色
tux2=cv2.inRange(hsv,lowx,uppx)#利用低指和高指匹配延时,所匹配的是绿色
#播放此输出的目标是原色
tux3 = cv2.bitwise_and(tux,tux, mask=tux2) cv2.imshow("video222",tux3) if 27==cv2.waitKey(20):#按键退出播放
break #.........................................................................
#创建一个窗口,中文显示会出乱码,第一个参数为窗口唯一标识字符串
#窗口大小可调整,默认参数为c v2.WINDOW_AUTOSIZE 根据图像大小自动创建大小
#可建多个
cv2.namedWindow("东小东标题",cv2.WINDOW_NORMAL) #.........................................................................
#创建鼠标点击事件回调函数,(事件,x轴位置,y轴位置,标记,属性)
def drawxxx(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDOWN:
print("鼠标按下",x,y)
#elif event==cv2.EVENT_MOUSEMOVE:
# print("鼠标滑动")
elif event==cv2.EVENT_LBUTTONUP:
print("鼠标抬起") #注册鼠标监听事件(窗口,回调函数)
cv2.setMouseCallback("东小东标题",drawxxx) #.........................................................................
t1=cv2.getTickCount()#利用cpu时间......
#xgtp()#调用图片像素遍历函数
#cjtx()#调用创建图形函数
#vediox()#调用视频处理函数
#tongdao()#通道处理
#pixel_operation()#像素点的加减乘除等处理
#pictureArea()#图片区域处理
#fill_color()#泛洪填充,相似像素填充
t2=cv2.getTickCount()
timesx=(t2-t1)/cv2.getTickFrequency()
print("花费时间:%s 毫秒"%(timesx*1000)) #显示图片,参数:(窗口唯一标识字符串,imread读入的图像)
#可以不基于窗口,可建多个
cv2.imshow("东小东标题",imgviewx) #.........................................................................
#将图片保存,写入到文件
cv2.imwrite("2.jpg",imgviewx) #.........................................................................
#窗口退出
#窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
#等待时间到则返回-1,如有键盘按键按下则返回按键的ASCII码
#可使用print(cv2.waitKey(0))获取该按键值
keyx=cv2.waitKey(0)
print(keyx)
if keyx==27:
print("你按下了键盘的:ESC键") #.........................................................................
#销毁窗口,退出程序
cv2.destroyAllWindows()

模拟实现一个简单的拍照程序:

 import cv2            #导入opencv库
import numpy as np #调用摄像头
def videox():
vix=cv2.VideoCapture(0) #打开摄像头
while True:
ret,tu=vix.read() # ret为返回值,tu为当前帧
tu1=cv2.flip(tu,1) #图像反转,1为左右对换,-1为上下对换
cv2.imshow("东小东标题",tu1) #显示图片在窗口上
if 65==cv2.waitKey(10): #等待大写 A 键盘按键按下
cv2.imwrite("DONG.jpg",tu1)#保存停止帧图片
break cv2.namedWindow("东小东标题")#创建一个窗口,中文显示会出乱码问题 videox() #调用摄像头函数 print(cv2.waitKey(0))#等待任意键按下,并输出该按键的值 cv2.destroyAllWindows()#销毁窗口

直方图基本:

 import cv2 #导入opencv库
import numpy
#直方图均衡化,对比度改变
def equalization_rgb(imgtu):
#只能使用灰度图片
imgx=cv2.cvtColor(imgtu,cv2.COLOR_RGB2GRAY)#转换为灰度 #默认参数,自接使用
#imgtu=cv2.equalizeHist(imgx)#均衡化 #可修改参数clipLimit的值得到不一样效果
chanlx=cv2.createCLAHE(clipLimit=30.0,tileGridSize=(8,8))
imgtu=chanlx.apply(imgx) cv2.imshow("equalization",imgtu)#显示 #直方图比较,图片相似度比较,遍历像素点,速度慢慢
def create_compara(imgtu):
h,w,t=imgtu.shape
rgbx=numpy.zeros([16*16*16,1],numpy.float32)
bsize=256/16
for row in range(h):
for col in range(w):
b=imgtu[row,col,0]
g=imgtu[row,col,1]
r=imgtu[row,col,2]
index=numpy.int(b/bsize)*16*16+numpy.int(g/bsize)*16+numpy.int(r/bsize)
rgbx[numpy.int(index),0]=rgbx[numpy.int(index),0]+1
return rgbx def compare_ing():
img1=cv2.imread("imgx/xxG.png")
img2=cv2.imread("imgx/xxR.png")
hist1=create_compara(img1)
hist2=create_compara(img2)
cv2.imshow("img1111",img1)
cv2.imshow("img2222",img2)
va1=cv2.compareHist(hist1,hist2,cv2.HISTCMP_BHATTACHARYYA)
va2=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)
va3=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR)
print("巴氏距离,越小越相似(0,1):",va1)
print("相关性,越接近于1,越相似:",va2)
print("卡方,越小越相似:",va3) #读取一张图片,地址不能带中文
imgviewx=cv2.imread("imgx/zcy.jpg") #创建一个窗口,中文显示会出乱码
cv2.namedWindow("东小东标题") #显示图片,参数:(窗口标识字符串,imread读入的图像)
cv2.imshow("东小东标题",imgviewx) #------------------
#equalization_rgb(imgviewx)#直方图均衡化,提高对比度
compare_ing()#直方图比较,图片相似度 #------------------- #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0) #销毁窗口,退出程序
cv2.destroyAllWindows()

模板匹配:

 import cv2 #导入opencv库

 #参数:(要寻找的目标,原图片)
def templatex(img_target,img_root): #模板匹配方法
#toolx=cv2.TM_SQDIFF_NORMED
toolx=cv2.TM_CCORR_NORMED
#toolx=cv2.TM_CCOEFF_NORMED h,w=img_target.shape[:2]#获取目标图像的高和宽
#操作匹配
result=cv2.matchTemplate(img_root,img_target,toolx)
#得到区域
min_x,max_x,min_y,max_y=cv2.minMaxLoc(result) #获取起始点坐标
if toolx==cv2.TM_SQDIFF_NORMED:
tl=min_y
else:
tl=max_y
#获取结束点坐标,其中tl[0]表示起始点x轴值,tl[1]表示y
br=(tl[0]+w,tl[1]+h)
#创建一个矩形框,参数(要写到的图片,起始点坐标,结束点坐标,颜色值,厚度)
cv2.rectangle(img_root,tl,br,(0,0,255),5)
#显示图片
cv2.imshow("img_rootxx",img_root) #读取一张图片,地址不能带中文
imgviewx=cv2.imread("imgx/wa.jpg") #创建一个窗口,中文显示会出乱码
cv2.namedWindow("东小东标题",cv2.WINDOW_NORMAL) #获取原图片截图
areax = imgviewx[110:529, 778:1200]
cv2.imshow("jjjttt",areax) templatex(areax,imgviewx) #显示图片,参数:(窗口标识字符串,imread读入的图像)
cv2.imshow("东小东标题",imgviewx) #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0) #销毁窗口,退出程序
cv2.destroyAllWindows()

二值化,黑白图片:

 import cv2 #导入opencv库

 #读取一张图片,地址不能带中文
imgviewx=cv2.imread("imgx/wa.jpg") #创建一个窗口,中文显示会出乱码
cv2.namedWindow("东小东标题") imgviewx2=imgviewx.copy()
#得到灰度图片
imgviewx2=cv2.cvtColor(imgviewx2,cv2.COLOR_BGR2GRAY)
#二值化图像,黑白图像,只有0和1,0为0,1为255
ret,imgviewx2=cv2.threshold(imgviewx2,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
#二值化方法2
imgviewx2=cv2.adaptiveThreshold(imgviewx2,200,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,5) #显示图片,参数:(窗口标识字符串,imread读入的图像)
cv2.imshow("img222222",imgviewx2)
cv2.imshow("东小东标题",imgviewx) #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0) #销毁窗口,退出程序
cv2.destroyAllWindows()

 附录:

HSV取值对应表:

树莓派(2018-06-27-raspbian-stretch.img)安装需要的依赖包:

sudo apt-get install libatlas-base-dev

sudo apt-get install libjasper-runtime

sudo pip3 install opencv-contrib-python

sudo apt-get install libhdf5-dev

sudo apt-get install libhdf5-serial-dev

sudo apt install libqtgui4

sudo apt install libqt4-test

sudo apt-get install libcv-dev


玩转Python图片处理 (OpenCV-Python )的更多相关文章

  1. Erlang/Elixir: 使用 OpenCV, Python 搭建图片缩略图服务器

    这篇文章是在OSX上测试和运行的的, Ubuntu下的安装和配置请移步到这里 应用程序进程树, 默认 Poolboy 中初始化10个用于处理图片的 Python 工作进程(Worker) 首先安装Op ...

  2. 快速 图片颜色转换迁移 Color Transfer Opencv + Python

      Super fast color transfer between images About a month ago, I spent a morning down at the beach, w ...

  3. OpenCV + Python 人脸检测

    必备知识 Haar-like opencv api 读取图片 灰度转换 画图 显示图像 获取人脸识别训练数据 探测人脸 处理人脸探测的结果 实例 图片素材 人脸检测代码 人脸检测结果 总结 下午的时候 ...

  4. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  5. 手把手教你如何用 OpenCV + Python 实现人脸识别

    下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特 ...

  6. OpenCV-Python(1)在Python中使用OpenCV进行人脸检测

    OpenCV是如今最流行的计算机视觉库,而我们今天就是要学习如何安装使用OpenCV,以及如何去访问我们的摄像头.然后我们一起来看看写一个人脸检测程序是如何地简单,简单到只需要几行代码. 在开始之前, ...

  7. opencv python实用操作

    画多边形 fillConvexPloy与fillConvexPloy的区别 fillConvexPloy 用来画单个凸多边形: 如果点集的连线不是凹多边形,则会找一个最小的凸多边形把该凹多边形包住画出 ...

  8. OpenCV+Python识别车牌和字符分割的实现

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  9. 手把手教你如何用 OpenCV + Python 实现人脸检测

    配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...

  10. Opencv python图像处理-图像相似度计算

    一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你 ...

随机推荐

  1. EasyPR源码剖析(1):概述

    EasyPR(Easy to do Plate Recognition)是本人在opencv学习过程中接触的一个开源的中文车牌识别系统,项目Git地址为https://github.com/liuru ...

  2. [精华][推荐]CAS SSO实现单点登录框架学习源码

    1.通过下载稳定版本的方式下载cas的相关源码包,如下: 直接选择4.2.1的稳定代码即可 2.我们项目中的版本版本使用maven apereo远程库去下载 通过远程maven库下载cas-serve ...

  3. JavaScript中的闭包永远都存储在内存中,除非关闭浏览器

    //閉包實現累加功能 function fn1() { var n = 1; add = function() { n += 1; } function fn2() { n += 1; console ...

  4. 解决win系统无法安装.NET Framework 4.0 4.6 原因是HRESULT0xc8000222

    1.开始----- 运行------- cmd ----- 键入net stop WuAuServ回车(停止windows update服务) 2.开始----- 运行----键入%windir%回车 ...

  5. sessionStorage和localStorage的使用方法

    1.sessionStorage sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空 JSON.pars ...

  6. 对于新版本的webstorm对vue的支持

    webstorm 对于官方vue的支持,直到2017.1,这个版本,之后的版本不能直接安装vue插件,这时候就需要自己手动新建vue模板了

  7. P3806 【模板】点分治1

    一道淀粉质的模版题,开始是暴力 #include <bits/stdc++.h> #define up(i,l,r) for(register int i = (l); i <= ( ...

  8. Linux---基础指令(一)

    https://www.linuxprobe.com/chapter-02.html  (Linux就要这么学) 一.执行查看帮助命令 date:date命令用于显示及设置系统的时间或日期,格式为“d ...

  9. Django模板标签

    一.模板标签 1.模板标签是在模板中运用python语言的实现,如for循环,if语句 2.模板标签的运用 2.1在teacher模板下创建students_list模板, 在teacher视图中国创 ...

  10. Linux学习---指针运算、修饰符(const、volatile、typedef)及、运算符(++、--、+、-)

    const:常量.只读[不能变] char *p; const char *p; [T] 字符串内容可以为“hello world”或“aaa”,但只读(不可修改) char const *p; ch ...