opencv-python基本使用:图像处理

图像处理:

import cv2    #导入opencv库
import numpy as np

img = cv2.imread("ma.jpg")  #读取一张图片,地址不能带中文
"""
第二个参数,取值可为:
cv2.IMREAD_COLOR=1:默认参数,读入一副彩色图片,忽略alpha通道
cv2.IMREAD_GRAYSCALE=0:读入灰度图片
cv2.IMREAD_UNCHANGED=-1:读入完整图片,包括alpha通道(png有,jpg无)
"""

img1 = cv2.imread("ma.jpg",cv2.IMREAD_GRAYSCALE)
cv2.namedWindow("new window")  #创建一个窗口,中文显示会出乱码
    #参数 窗口标题

cv2.imshow("new window", img1)   #显示图片
    #参数1:窗口标题--不能是Pyqt的窗口;如果找不到参数1的窗口就新建一个
    #imread读入的图像

cv2.imshow("new", img)

print(img.shape)    #输出:(452, 400, 3) 高像素(行数),宽像素(列数),通道数(一个像素有三个通道RGB)# 灰度图由于没有颜色通道,使用shape属性返回的是(图像的高度,图像的宽度)。
print(img.size)   # 542400  总通道数=高* 宽* 通道数
print(img.dtype)# uint8  3个通道每个通道占的位数(8位,一个字节)
#print(img)  #输出每个像素点的参数( B , G , R )
#print(np.array(img)) #输出每个像素点的参数( B , G , R )
print(cv2.mean(img))   #获取图片 B G R 各个均值
#(210.87173119469026, 222.68342920353982, 228.77969579646017, 0.0)
#而pixel mean的话,其实是图片的所有R通道像素,求了均值,G,B通道类似,所以求出来就是三个数值(R_mean,G_mean,B_mean)

print(cv2.meanStdDev(img))  #获取均值和方差,可用均值方差都为零判断图片无效
#(array([[210.87173119],[222.6834292 ],[228.7796958 ]]), array([[67.49584092],[54.39694368],[46.32777341]]))
#array([[210.87173119],[222.6834292 ],[228.7796958 ]])  是B G R 各个均值
#array([[67.49584092],[54.39694368],[46.32777341]])  是方差
#方差的概念:https://wenku.baidu.com/view/474731e31b37f111f18583d049649b6648d709d4.html

img2=img.copy()  #复制图片
cv2.imshow("fuzi", img2)


cv2.waitKey(5000)  #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数

cv2.destroyAllWindows()   #销毁窗口,退出程序

创建窗口

cv2.namedWindow("operation", cv2.WINDOW_AUTOSIZE)  #创建窗口--方式一
#cv2.namedWindow('image',cv2.WINDOW_AUTOSIZE)  #创建窗口--方式二
#cv2.WINDOW_NORMAL  窗口大小可以改变
#cv2.WINDOW_AUTOSIZE   窗口大小不可以改变
#cv2.WINDOW_FREERATIO  窗口大小自适应比例
#cv2.WINDOW_KEEPRATIO  窗口大小保持比例
#cv2.WINDOW_GUI_EXPANDED  显示色彩变成暗色

保存图像

cv2.imwrite("2.jpg",img)     # 存储图片

像素操作

import cv2
img = cv2.imread("1.png")
print(img)
print(img[0,0])  #获取第一行第一列的像素--获取指定像素#参数1 是列坐标    参数2 是横坐标
print('第一列数据')
print(img[:,0])  #获取第一列数据
print('第一行数据')
print(img[0,:])  #第一行数据

#可以看到,每个像素点都是由三个数组成的元组,这三个数分别表示bgr的蓝色通道数值、绿色通道数值和红色通道数值
import cv2
img = cv2.imread("1.png")
i=img[100,100]
(b,g,r)=i
print(i,b,g,r)
for x in range(0,101):  #从(100,100)到(200,100)画一条竖直的蓝线
    img[100+x,100]=(250,0,0)  #指定点修改像素值
cv2.imshow("new window", img)

cv2.waitKey(0)

图像缩放

import cv2
img = cv2.imread("1.png")
#img1=cv2.resize(img,(300,400))  #修改图片的尺寸
img1=cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)  #修改图片的尺寸
#参数1 原图片
#参数2 修改后的尺寸;300宽  400高;表示缩放后图像的大小。如果设置了这个参数,那么设置的(width,height)就代表将原图像缩放到指定的宽高;如果未设置这个参数(0,0),那么原图像缩放之后的大小就要通过公式“dsize=(round(fx*原图像的宽),round(fy*原【的高))”来计算,fx和fy表示图像宽度方向和高度方向上的缩放比例
#fx:可选参数,表示图像宽度方向上的缩放比例,默认为0,表示自动按照“(double)dsize.width/原图像的宽度”来计算。
#fy:可选参数,表示图像高度方向上的缩放比例,默认为0,表示自动按照“(double)dsize.height/原图像的高度”来计算。
#interpolation  所用的插值方法
#INTER_NEAREST    最近邻插值;INTER_LINEAR 双线性插值(默认设置);INTER_AREA 使用像素区域关系进行重采样;INTER_CUBIC 4x4像素邻域的双三次插值;INTER_LANCZOS4 8x8像素邻域的Lanczos插值
cv2.imwrite("3.jpg",img1)

cv2.waitKey(0)

图片裁剪

import cv2
img = cv2.imread("500x400.jpg")
img1=img[100:300,125:375]  #需要保留的区域--裁剪
#参数1 是高度的范围,参数2是宽度的范围


cv2.imwrite("linsi.jpg",img1)

cv2.waitKey(0)

绘图

写入文字
import cv2
import numpy as np

img = cv2.imread("500x400.jpg")

font=cv2.FONT_HERSHEY_SIMPLEX
font=cv2.FONT_HERSHEY_DUPLEX
img1=cv2.putText(img,'wo is liming',(80,90), font, 2,(255,255,255),3)  #画文字
#参数3 位置
#参数5 字体大小
#参数7 线型


cv2.imwrite("linsi.jpg",img1)
cv2.waitKey(0)
绘制矩形
import cv2

image = cv2.imread("wuhuan.jpg",1)
cv2.rectangle(image,(50,100),(200,200),(255,0,0),-1)
cv2.imshow('image',image)
cv2.waitKey()
绘制多边形
import cv2
import numpy as np

img = cv2.imread("500x400.jpg")

points = np.array([[150,50],[140,140],[200,170],[250,250],[150,50]],np.int32)  #多边形各顶点坐标
#数据类型必须是np.int32
points = points.reshape(-1,1,2)

img1=cv2.polylines(img,[points],True,(0,0,255),3)  #画多边形
#参数2 各顶点
#参数3 True表示封闭,False表示不封闭
#参数4 颜色
#参数5 线条粗细

cv2.imwrite("linsi.jpg",img1)
cv2.waitKey(0)
绘制椭圆
import cv2
img = cv2.imread("500x400.jpg")
img1=cv2.ellipse(img,(256,256),(100,50),0,30,180,(255,0,0),-1) # 画椭圆
#参数2 椭圆中心
#第三个参数 椭圆的长短轴的长度
#第四个参数  整个椭圆的偏转角度(顺时针)
#第五个参数  圆弧起始角的角度
#第六个参数  圆弧终结角的角度
# 圆弧角度->x轴方向为0,逆时针方向为正
#第七个参数  color 线条的颜色
#第八个参数   线条的粗细程度,如果是负数表示填充
#第九个参数   line_type 线条的类型  ???

cv2.imwrite("linsi.jpg",img1)
cv2.waitKey(0)
绘制矩形
import cv2
img = cv2.imread("500x400.jpg")
img1=cv2.rectangle(img,(10,10),(30,40),(255,0,0),2)  #画矩形
#参数2 左上角坐标;参数3 右下角坐标;参数4 颜色;参数5 线条宽度

cv2.imwrite("linsi.jpg",img1)
cv2.waitKey(0)
绘制线
import cv2
img = cv2.imread("500x400.jpg")
img1=cv2.line(img,(10,10),(200,200),(0,255,0),3) #直线
#参数2 起点坐标;参数3 终点坐标;参数4 颜色;参数5 线条宽度

cv2.imwrite("linsi.jpg",img1)

cv2.waitKey(0)
绘制点和圆圈
import cv2
img = cv2.imread("500x400.jpg")
img1=cv2.circle(img,(60,60),30,(0,0,255),-1)  #画一个红色实心圆
img1=cv2.circle(img1,(200,200),50,(255,0,0),3)  #画一个蓝边框的圆

cv2.imwrite("linsi.jpg",img1)

cv2.waitKey(0)
绘制图片
import cv2
image=cv2. imread('1.png')
height=int(image.shape[0]*0.2)
width =int(image.shape[1]* 0.2)
image_resize=cv2. resize(image,(width, height))
for i in range(height):
    for j in range(width):
        image[i+100,j+100]=image_resize[i,j]

cv2. imshow(' dst', image)
cv2.waitKey()

图像平移

import numpy as np
import cv2

img = cv2.imread("3.jpg")
cv2.imshow("yuan", img)
img_info=img.shape
height=img_info[0]
width=img_info[1]

mat_translation=np.float32([[1,0,20],[0,1,50]])  #变换矩阵:设置平移变换所需的计算矩阵:2行3列
#[[1,0,20],[0,1,50]]   表示平移变换:其中20表示水平方向上的平移距离,50表示竖直方向上的平移距离。
dst=cv2.warpAffine(img,mat_translation,(width+20,height+50))  #变换函数
cv2.imshow('dst',dst)
cv2.waitKey(0)

图像镜像翻转

import numpy as np
import cv2

img = cv2.imread("3.jpg")
cv2.imshow("yuan", img)
img1 = cv2.flip(img,1)  #镜像
'''
参数2 必选参数。用于指定镜像翻转的类型,其中0表示绕×轴正直翻转,即垂直镜像翻转;1表示绕y轴翻转,即水平镜像翻转;-1表示绕×轴、y轴两个轴翻转,即对角镜像翻转。
参数3 可选参数。用于设置输出数组,即镜像翻转后的图像数据,默认为与输入图像数组大小和类型都相同的数组。
'''

cv2.imshow('dst',img1)

cv2.waitKey(0)

图像旋转

import cv2

img = cv2.imread('3.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height= imgInfo[0]
width = imgInfo[1]
deep = imgInfo[2]
matRotate = cv2.getRotationMatrix2D((width*0.5, height*0.5), 45, 0.9) # 旋转变化矩阵
'''
参数1 必选参数。用于设置旋转中心点,点坐标为OpenCV图像坐标系下的坐标。
参数2 必选参数。用于设置旋转的角度,单位为度。
参数3 必选参数。用于设置缩放系数,即对旋转的图像进行缩放。
'''
dst = cv2.warpAffine(img, matRotate, (width,height))  #旋转
'''
参数2 变换矩阵:是一个2行3列的矩阵,由这个矩阵决定是何种变换
参数3 变换后输出图像的大小:(width,height)-->宽和高(自己规定)
'''
cv2.imshow('dst',dst)


cv2.waitKey(0)

图像叠加

import cv2
import numpy as np
import random

img = cv2.imread("500x400.jpg",1)
img1 = cv2.imread("tuzi500x400.jpg",1)
cv2.imshow('img',img)
cv2.imshow('img1',img1)
dst=cv2.add(img,img1)
'''
参数1 参数2 待叠加的两个图像,两个图像的大小,通道数必须一致
'''

cv2.imshow('dst',dst)
cv2.waitKey()

图像颜色反转

灰度图的图像颜色反转
import cv2
import numpy as np

img = cv2.imread("3.jpg",0)  #读取一张图片,灰度
height,width=img.shape
dst=np.zeros((height,width,1),np.uint8)
for i in range(height):
    for j in range(width):
        dst[i,j]=255-img[i,j]

cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey()  #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
bgr图像的图像颜色反转
import cv2
import numpy as np

img = cv2.imread("2013.jpg",1)  #读取一张图片,彩色
cha=img.shape
height,width,deep=cha
dst=np.zeros((height,width,3),np.uint8)
for i in range(height):  #色彩反转
    for j in range(width):
        b,g,r=img[i,j]
        dst[i,j]=(255-b,255-g,255-r)
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey()

图像毛玻璃模糊效果

import cv2
import numpy as np
import random

img = cv2.imread("2013.jpg",1)  #读取一张图片,彩色
cha=img.shape
height,width,deep=cha
cv2.imshow('img',img)
dst=np.zeros(cha,np.uint8)
randon_v=5  #用来替换的范围--这个值越大毛玻璃效果越明显
#防止越界
for m in range(height-randon_v):  #毛玻璃效果
    for n in range(width-randon_v):
        index=random.randint(1,randon_v)
        (b,g,r)=img[m+index,n+index]
        dst[m,n]=(b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey()

边缘检测

import cv2

image = cv2.imread("wuhuan.jpg",1)
image_info =image.shape
height=image_info[0]
width=image_info[1]
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray',gray)

image_G=cv2.GaussianBlur(gray,(5,5),0)  

dst=cv2.Canny(image_G,50,50)  #边缘检测
cv2.imshow("dst",dst) cv2.waitKey()

视频

通过打开摄像头捕捉视频
import cv2
#获取一个视频并打开
cap=cv2.VideoCapture(0)  #打开摄像头并创建摄像头对象
#其中0表示打开内置摄像头,1表示打开外接摄像头
if cap.isOpened():  #VideoCaputre对象是否成功打开
    print('已经打开了摄像头捕捉视频')
else:
    print('打开摄像头失败')
通过打开视频文件读取视频
import cv2
#获取一个视频并打开
cap=cv2.VideoCapture('1.mp4')

if cap.isOpened():  #VideoCaputre对象是否成功打开
    print('已经打开了视频文件')
else:
    print('视频文件打开失败')
分解视频
import cv2
#获取一个视频并打开
cap=cv2.VideoCapture('1.mp4')

if cap.isOpened():  #VideoCaputre对象是否成功打开
    print('已经打开了视频文件')
    fps = cap.get(cv2.CAP_PROP_FPS)  # 返回视频的fps--帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 返回视频的宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 返回视频的高
    print('fps:', fps,'width:',width,'height:',height)
    i=0
    while 1:
        if i==15:
            print('保存了视频的前15帧图像,保存结束')
            break
        else:
            i=i+1
            ret, frame = cap.read()  # 读取一帧视频
            # ret 读取了数据就返回True,没有读取数据(已到尾部)就返回False
            # frame 返回读取的视频数据--一帧数据
            file_name='.\\aa\\img'+str(i)+'.jpg'
            cv2.imwrite(file_name, frame)


else:
    print('视频文件打开失败')

生成视频

import cv2
#获取一张图片的宽高作为视频的宽高
image=cv2.imread('./aa/img5.jpg')
cv2.imshow("new window", image)   #显示图片
image_info=image.shape
height=image_info[0]
width=image_info[1]
size=(height,width)
print(size)
fps=30
fourcc=cv2.VideoWriter_fourcc(*"mp4v")
video = cv2.VideoWriter('ss.mp4', cv2.VideoWriter_fourcc(*"mp4v"), fps, (width,height)) #创建视频流对象-格式一

#video = cv2.VideoWriter('ss.mp4', cv2.VideoWriter_fourcc('m', 'p', '4', 'v'), fps, (width,height)) #创建视频流对象-格式二

"""
参数1 即将保存的文件路径
参数2 VideoWriter_fourcc为视频编解码器
    fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成,下面是VideoWriter_fourcc对象一些常用的参数,注意:字符顺序不能弄混
    cv2.VideoWriter_fourcc('I', '4', '2', '0'),该参数是YUV编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'),该参数是MPEG-1编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),该参数是MPEG-4编码类型,文件名后缀为.avi 
    cv2.VideoWriter_fourcc('T', 'H', 'E', 'O'),该参数是Ogg Vorbis,文件名后缀为.ogv 
    cv2.VideoWriter_fourcc('F', 'L', 'V', '1'),该参数是Flash视频,文件名后缀为.flv
    cv2.VideoWriter_fourcc('m', 'p', '4', 'v')    文件名后缀为.mp4
参数3 为帧播放速率
参数4 (width,height)为视频帧大小

"""
for i in range(1,60):
    file_name = './aa/img' + str(i) + '.jpg'
    image=cv2.imread(file_name)
    video.write(image)  # 向视频文件写入一帧--只有图像,没有声音
cv2.waitKey()
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知趣li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值