opencv 简单基础处理笔记

opencv基础

-----------------------------------------------------------------------------参考教程OpenCV轻松如man:面向python 李立宪------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

环境搭建

opencv基础环境搭建
将对应安装包从官网下载好版本:python3 、opencv3、 pycharm
pip install opencv-python
pip install opencv-contrib-python//扩展模块
pip install pytesseract//谷歌开源的OCR的引擎
opencv模块

opencv模块 扩展模块
视频分析 2D特征提取 机器学习 异构与并行计算 图像拼换 超分辨 相机矫正与三维重建 分割与匹配 深度神经网络 三维可视化 对象检测
Image processing Hight-level GUI:窗口和图片显示
Core:像素级别的运算和操作
Imgcodecs:图像的读写 VideoI/O:视频的读写

图像处理入门基础

图像是由像素构成的
图像分类

  • 二值图像:非黑即白,只有两个值0或1。
  • 灰度图像:有灰、有黑、有白,有多个值 ,区间在0~255之间。
  • 彩色图像:
    RGB图像- 三个单色通道叠加,第0通道:R的取值0~255;第1通道:G的取值0 ~255;第2通道:B的取值0 ~ 255。
    BGR图像-三个单色通道叠加,第0通道:B的取值0 ~255;第1通道:G的取值0 ~255;第2通道:R的取值0 ~255。

像素处理

读取像素:返回值=(位置参数)

//灰度图像,返回灰度值。
p = img[88,142]//在名为img的图像中提取第88行,142列的像素的值
print(p)
//BGR图像,返回B、G、R的值
p=img[78125]//在名为img的图像中提取78行,125列的像素的值
print(p)//返回值为三个值
//BGR图像,分别返回B、G、R的值
blue=img[78,125,0]//在名为img的图像中提取第78125列第0个通道
print(blue)//B通道上的像素值
green=img[78,125,0]
print(green)//G通道的像素值
red=img[78,125,0]
print(red)//R通道上的像素值

修改像素

import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.bmp文件,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
p=i[100,100]//读取i图片的第100100列的像素的值
print(p)//输出p的值
i[100,100]=255//更改i图片的第100行第100列的像素的值为255
p=i[100,100]//再次将像素值赋值给p
print(p)//输出p的值
//不赋值到变量上直接打印
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.bmp的灰度图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
print(i[100,100])//直接打印第100100列的像素的值
i[100,100]=255//更改第100100列的像素的值为255
print(i[100,100])//直接输出第100100列的像素的值
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
print(i[100,100])
i[100,100,2]=255
print(i[100,100])
import cv2//导入CV2的库
i = cv2.imread("D:\\lesson\\image\\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用CV2的imread的方法读入该E盘的test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型
cv2.imshow("original",i)
i[100:150,100:150]=[255,255,255]//i图片的第100行到150行,第100列到150列的像素值都更改为255,255,255
cv2.imshow("result",i)
cv2.waitKey(0)
cv2.destoryAllWindows()

使用numpy进行像素处理

读取像素:返回值=图像.item(位置参数)

//灰度图像,返回灰度值
p=img.item(88,142)//用numpy中item提取img图片第88142列的像素值
print(p)//返回p的值

//BGR图像,返回值为B、G、R的值
blue=img.item(78,125,0)//用numpy中item提取img图片的第781250通道的像素值
green=img.item(78,125,1)//用numpy中item提取img图片的第781251通道的像素值
red=img.item(78,125,2)//用numpy中item提取img图片的第781252通道的像素值
print(blue)
print(green)
print(red)

修改像素:图像名.itemset(位置,新值)

//灰度图像
import cv2
import numpy as np
i=cv2.imread("image\test.bmp",cv2.IMREAD_UNCHANGED)//导入图片:用cv2的imread方法读取test.bmp的灰度图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型.
print(i.item(100,100))
i.itemset((100,100),255)
print(i.item(100,100))

//BGR图像
import cv2
import numpy as np
i=cv2.imread("image\test.png",cv2.IMREAD_UNCHANGED)//导入图片:用cv2的imread方法读取test.png的彩色图像,读入类型为.IMREAD_UNCHANGED即不更改原图片类型.
print(i,item(100,100,0))//用numpy中item提取i图像的第100行第1000通道
i.itemset((100,100,0),255)
print(i.item(100,100,0))
print(i,item(100,100,1))
i.itemset((100,100,1),255)
print(i.item(100,100,1))
print(i,item(100,100,2))
i.itemset((100,100,2),255)
print(i.item(100,100,2))

获得图像属性

形状:shape可以获取图像的形状,返回包含行数、列数、通道数的元组。

  • 灰度图像:返回行数、列数。
  • 彩色图像:返回行数、列数、通道数。

像素数目:size可以获取图像的像素数目。

  • 灰度图像:返回行数 * 列数。
  • 彩色图像:返回行数 * 列数 * 通道数。

图像类型:dtype返回的是图像的数据类型。

import cv2
a=cv.imread("img\test.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.imread("img\test.png"cv2.IMREAD_UNCHANGED)
print(a.shape)
print(b.shape)
print(a.size)
print(b.size)
print(a.dtype)
print(b.dtype)

###图像ROI
图像ROI:图像的感兴趣区域。


import cv2
import numpy as np
a=cv2.imread("img\test.png")
b=np.ones((101,101,3))//生产一个新的感兴趣区域,创建一个3通道行为101列为101
b=a[220:400,250:350]
a[0:180,0:100]=b
cv2.imshow("original",a)//显示窗口名字为original 图片为a
cv2.imshow("face",b)//显示窗口名字为face图像为b
cv2.waitKey()
cv2.destoryAllWindows()

import cv2
import numpy as np
a=cv2.imread("img\test.png")
c=cv2.imread("img\test.bmp")
b=np.ones((101,101,3))//生产一个新的感兴趣区域,创建一个3通道行为101列为101
b=a[220:400,250:350]
c[0:180,0:100]=b
cv2.imshow("original",c)//显示窗口名字为original 图片为c
cv2.waitKey()
cv2.destoryAllWindows()

通道的拆分与合并

拆分

  • b=img[ :, :,0 ] g=img[: , :,1 ] r=img[ :, :,2] //获取单个通道
  • b,g,r=cv2.split(img )//一次性拆分出img图片的三个通道.
  • b=cv2.split(img)[0] g=cv2.split(img)[1] r=cv2.split(img)[2]//获取单个通道

合并

  • m=cv2.merge([b,g,r])//将b、g、r三个图像合并,注意通道合并的顺序
import cv2
a=imread("img\test.png")
b,g,r=cv2.split(a)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
m=cv2.merge([b,g,r])
//m=cv2.merge([r,g,b])
cv2.imshow("merge",m)
cv2.waiKey()
cv2.destroyAllWindows()

import cv2
import numpy as np
a=imread(“img\test.png”)
rows,cols,chn=a.shape//求a图像的行列大小
b,=cv2.split(a)[0]
g=np.zreo((rows,cols),a.dtype)//生成一个与a行列大小一样的空通道,且类型相等
r=np.zreo((rows,cols),a.dtype)//生成一个与a行列大小一样的空通道,且类型相等
m=cv2.merge([b,g,r])
cv2.imshow(“merge”,m)
cv2.waiKey()
cv2.destroyAllWindows()

图像加法

Numpy加法

  • 取模加法:结果=图像1+图像2(八位二进制最大值为255)
    像素值<= 图像1+图像2 100+58=158 像素值>255 结果对255取模 255+58=(255+58)% 255=58
    -饱和运算:结果=cv2.add(图像1,图像2)
    像素值<= 图像1+图像2 100+58=158 像素值>255 结果为255 255+58=255

参与运算的图像大小、类型必须一致

import cv2
import numpy as np
 a=cv2.imread("image\test.bmp")
 b=a
 add1=a+b
 add2=cv2.add(a,b)
 cv2.imshow("original",a)
 cv2.imshow("add1",add1)
 cv2.imshow("add2",add2)
 cv2.waitKey()
 cv2.destroyAllWindows()

图像融合

图像融合
结果图像=图像1权重系数1+图像2权重系数2=亮度调节量
img=img0.3+img0.7=18
函数addWeighted
dst=cv.addWeighted(src1,alpha,src2,beta,gamma)
dst = src1alpha + src2beta + gamma;//运算公式
参数gamma不能省略,gamma=0 即不进行亮度调节

import cv2
import numpy as np
 a=cv2.imread("image\test1.bmp")
 b=cv2.imread("image\test2.bmp")
result=cv2.addWeighted(a,1,b,1,0)
 cv2.imshow("a",a)
 cv2.imshow("b",b)
  cv2.imshow("result",result)
 cv2.waitKey()
 cv2.destroyAllWindows()

类型转换

图像类型转换

  • 彩色变灰度
import cv2
a=cv2.imread("image\\test.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow("test",a)
cv2.imshow("gray",b)
cv2.waitKey()
cv2.destoryWindows()
  • BGR变RGB
import cv2
a=cv2.imread("image\\test.png")
b=cv2.cvtColor(a,cv2.COLOR_BGR2RGB)
cv2.imshow("test",a)
cv2.imshow("rgb",b)
cv2.waitKey()
cv2.destoryWindows()
  • GYAY变BGR
import cv2
a=cv2.imread("image\\test.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",a)
cv2.imshow("bgr",b)
cv2.waitKey()
cv2.destoryAllWindows()

图像缩放

resize函数
dst=cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])
src:原始图像
dsize:缩放大小(列,行)
fx,fy:在不使用dsize缩放时即dsize= None在x轴y轴分别的缩放大小。(列,行)通过round进行对行、列取整。
dsize与fx、fy有一个即可

import cv2
a=cv2.imread("image\\test.png")
b=cv2.resize(a,(200,100))
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
a=cv2.imread("image\\test.png")
rows,cols,chn=a.shape
size= ((round(cols*0.5),round(rows*1.5))
b=cv2.resize(a,size)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
a=cv2.imread("image\\test.png")
rows,cols,chn=a.shape
b=cv2.resize(a,None,fx=0.5,fy=1.3)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()

图像翻转

flip函数
dst = cv2.filp(src,filpCode)
src:源文件
filpCode:值为0是以x轴为对称轴翻转、值为大于0以y轴为对称轴翻转、值小于0在x轴y轴方向同时翻转

import cv2
a=cv2.imread("image\\test.png")
b=cv2.filp(a,0)
cv2.imshow("test",a)
cv2.imshow("test",b)
cv2.waitKey()
cv2.destroyAllWindows()

阈值分割

二进制阈值化:cv2.THRESH_BINARY
先要选定一个特定的阈值量,如177.新的阈值产生规律为大于等于177的像素点的灰度值设定为最大值 (如8位灰度值最大值为255)灰度小于177的像素点的灰度值设定为0.
反二进制阈值化:cv2.THRESH_BINARY_INV
该阈值化与二进制阈值化相似,先选定一个特定的灰度作为阈值,以8为灰度图为例,大于阈值的设定为0,小于该阈值的设定为255.
截断阈值化:cv2.THRESH.TRUNC
需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。
反阈值化为0:cv2.THRESH_TOZERO_INV
先选定一个阈值,然后对图像做如下处理,大于等于阈值的像素点变为0,小于该阈值的像素点保持不变。
阈值化为0:cv2.THRESH_TOZERO
先选定一个阈值,然后对图像进行如下处理,大于等于阈值的像素点,值保持不变,小于该阈值的像素点,值变为0.
threshold及实现
retval,dst=cv2threshold(src,thresh,maxval,type)
retval:阈值
dst:处理结果
src:,源图像
thresh:,阈值
maxval:,最大值
type:,类型

import cv2
a=cv2.imread("image\\test.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,128,255,cv2.THRESH_BINARY)
cv2.imshow("original",a)
cv2.imshow("result",b)
cv2.waitKey()
cv2.destroyAllWindows()

均值滤波

均值滤波
任意一点的像素值,都是周围NN个像素值的均值。
原始图像
核=滤波结果图像
函数blur
处理结果=cv2.blur(原始图像,核大小)

import cv2
a= cv2.imread("image\\test.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",a)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

方框滤波

函数boxFilter
处理结果=cv2.boxFilter(原始图像,目标图像深度,核大小,normalize属性)
目标图像深度:int类型的目标深度。通常使用“-1”表示与原始图像一致。
normalize属性:是否对目标图像进行归一化处理。值为true,与均值滤波相同,值为false,就是求和,很容易发生溢出现象。默认为进行归一化处理。

import cv2
a=cv2.imread("image\\test.png")
r=cv2.boxFILTER(a,-1,(5,5))
cv2.imshow("original",a)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

课程不见了 更不了 我对我自己无语了

你可能感兴趣的:(opencv,python)