OPENCV学习(更新)

OPENCV学习1

显示一张图片:

import cv2
import numpy as np
img = cv2.imread('F:/ImageProcessingLearning/documents/project/lianxi.jpg',cv2.IMREAD_COLOR)
cv2.imshow("image",img)
cv2.waitKey(0)

Numpy
由于机器学习算法在数据处理过程中大都涉及线性代数的知识,需要用到矩阵操作,Python本身没有处理矩阵的数据类型,因此需要使用附加的函数库。**
其中NumPy函数库是Python开发环境的一个独立模块,是Python的一种开源的数值计算扩展工具。
NumPy的发音是【'numpai】,取自”Numeric(数值)“和”Python“的简写。顾名思义,它是处理数值计算最为基础的类库。NumPy参考了CPython(用C语言实现的pyhton及其解释器)的设计,其本身也是由C语言开发而成的。
这种工具可以用来存储和处理大型多维矩阵,比Python自身的列表结构要高效的多。尽管Python的list类型已经提供了类似于矩阵的表示形式,但是NumPy提供了更多的科学计算函数。
NumPy被定位为数学基础库,属于比较底层的Python库,其地位趋向于成为一个被其它库调用的核心库。
在使用NumPy库之前,首先必须导入该函数库,导入方式如下:import numpy as np
————————————————

imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:**
cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1。

cv2.imread在不加第二个参数的情况下默认将图片转换成了一个三维数组,最里面的一维代表的是一个像素的三个通道的灰度值,第二个维度代表的是第一行所有像素的灰度值,第三个维度,也就是最外面的一个维度代表的是这一张图片。
————————————————
cv2.imShow()函数可以在窗口中显示图像。该窗口和图像的原始大小自适应(自动调整到原始尺寸)。
第一个参数是一个窗口名称(也就是我们对话框的名称),它是一个字符串类型。第二个参数是我们的图像。您可以创建任意数量的窗口,但必须使用不同的窗口名称。

cv2.waitKey(0)link

cv2.imread来读取图片

import cv2
import matplotlib.pyplot as plt
import numpy as np
img=cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg")
print(img)

```python
import cv2

img=cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg")
print(img)
```*(其实像这样就行了,import matplotlib.pyplot as plt,import numpy as np,这两行不知道什么意思)

显示结果:

```python
[[[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  ...
  [255 255 255]
  [255 255 255]
  [255 255 255]]

 ...

 [[255 120  22]
  [255 120  22]
  [255 120  22]
  ...
  [255 120  22]
  [255 120  22]
  [255 120  22]]

 [[255 120  22]
  [255 120  22]
  [255 120  22]
  ...
  [255 120  22]
  [255 120  22]
  [255 120  22]]

 [[255 120  22]
  [255 120  22]
  [255 120  22]
  ...
  [255 120  22]
  [255 120  22]
  [255 120  22]]]

代表的含义:对于一个像素点来说最小值是0最大值是255,0是黑,255是白;每一个点例如:[255 255 255],都是像素点,这样就把图像读进来了。

import cv2

img=cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg")
print(img)
cv2.imshow("image",img)#image是给窗口指定一个名字,任意名字
cv2.waitKey(0)#设置等待时间,毫秒级,0表示任意键终止
cv2.destroyAllWindows()

定义函数cv_show来代替这三行代码(要显示图片每次都要输入这三行代码,非常麻烦)

一定要加冒号!!!

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
### 得到图像的shape值:

```python

import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg")
#print(img)
cv2.imshow("image",img)#image是给窗口指定一个名字,任意名字
cv2.waitKey(0)  # 设置等待时间,毫秒级,0表示任意键终止  (0)可以自己设定等待时间
cv2.destroyAllWindows()
print(img.shape)

运行结果:
显示图片,任意键终止;得到图片的shape值:(1120, 720, 3)。(1120, 720, 3)中的3表示图像是RGB格式,在OPRENCV当中是BGR,顺序变了(代表的是彩色图像)。

上面是RGB,现在变成黑白

彩色:cv2.IMREAD_COLOR
灰度:cv2.IMREAD_GRAYSCALE

变成灰度图代码,print(img)
import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg",cv2.IMREAD_GRAYSCALE)
print(img)

结果:

F:\Anaconda\python.exe C:/Users/Administrator/PycharmProjects/pythonProject1/main.py
[[255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 ...
 [106 106 106 ... 106 106 106]
 [106 106 106 ... 106 106 106]
 [106 106 106 ... 106 106 106]]

Process finished with exit code 0
print(img.shape)
import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg",cv2.IMREAD_GRAYSCALE)
#print(img)
# cv2.imshow("image",img)#image是给窗口指定一个名字,任意名字
# cv2.waitKey(0)  # 设置等待时间,毫秒级,0表示任意键终止  (0)可以自己设定等待时间
# # cv2.destroyAllWindows()
print(img.shape)
F:\Anaconda\python.exe C:/Users/Administrator/PycharmProjects/pythonProject1/main.py
(1120, 720)

Process finished with exit code 0

(1120, 720) 与==(1120, 720, 3)==对比,少了个3,BGR

图像保存:

cv2.imwrite(“你要保存的路径”,图像的名字)

import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg",cv2.IMREAD_GRAYSCALE)

cv2.imwrite("F:/ImageProcessingLearning/documents/project/baocun1.png",img)

在这里插入图片描述

图像的基本属性:类型、大小、数据类型

import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg",cv2.IMREAD_GRAYSCALE)
changdu=img.size#size()函数主要是用来统计矩阵元素个数,或矩阵某一维上的元素个数的函数
print(changdu)
geshi=type(img)#表达式的值的类型
print(geshi)
shuju=img.dtype#返回数据元素的数据类型(int、float等)
print(shuju)

数据读取——视频

视频处理简介

视频的读取是将视频拆分成一个一个(贞)图片,再进行处理。
●cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1。
●如果是视频文件,直接指定好路径即可。
python中= 和 = =的区别
一个等号代表的含义是赋值,将某一数值赋给某个变量,比如a=3,将3这个数值赋予给a。
两个等号是判断是否相等,返回True或False,比如11。他们是相等的,那么就返回true。12,他们是不相等的,那么就返回false。

cv2.cvtColor方法会用来对图片颜色通道进行转换

经常用到的颜色转换:BGR–>RGB, BGR–>Gray 和 BGR–>HSV
BGR–>RGB: 经过摄像头采集的图像的通道排列顺序为BGR,而BMP文件的排列顺序也为BGR,所以保存成BMP文件使不会出现什么问题。
但是在显示器上显示的时候的排列顺序为RGB,所以RGB是为了让机器更好的显示图像,。
BGR–>Gray:将BGR的图像转为单通道的灰色图像
BGR–>HSV: 一般对颜色空间的图像进行有效处理都是在HSV空间进行的。RGB是为了让机器更好的显示图像,对于人类来说并不直观,
HSV更为贴近我们的认知,所以通常我们在针对某种颜色做提取时会转换到HSV颜色空间里面来处理.

```python

import cv2
 
image_path = ".\\pictreus\canglaoshi.jpg"
 
def cvt():
    img = cv2.imread(img_path)
    cv2.imshow("img", img)
        # BGR-->RGB
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cv2.imshow("img_rgb", img_rgb)
 
        # 图像的灰化YUV(Y为灰度图, Y=0.299R+0.587G+0.114B):BGR-- >Gray
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cv2.imshow("img_gray", img_gray)
 
        # HSV模型转化YUV(Y为亮度, UV代表色度)BGR-->HSV
    img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    cv2.imshow("img_hsv", img_hsv)
 
    cv2.waitKeyEx(0)

视频处理代码:

import cv2

vc=cv2.VideoCapture("F:/ImageProcessingLearning/documents/project/lianxi4.mp4")#vc=cv2.VideoCapture("指定视频的路径")
#检查是否打开正确
if vc.isOpened():#判断载入的视频是否可以打开
    open,frame=vc.read() #进行单张图片的读取,open的值为True或者Flase,读的没有问题,open为True,程序继续执行,如果读的有问题那么就会给open赋值
                         # 为Flase,, frame表示读入的图片(读入的是图片)
else:
    open=False
while open:#open是1那么一直执行,说明读的图片没有问题,有问题open为0,跳出循环。
    ret,frame=vc.read()#ret的值为True或者Flase
    if frame is None:#如果读到的图像为空,跳出
        break
    if ret==True:#ret的值为True或者Flase
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow("result",gray)
        if cv2.waitKey(50) & 0xFF==27:#27表示的是退出键
            break
vc.release()
cv2.destroyAllWindows()


cv2.waitKey(delay)参数:
1、delay≤0:一直等待按键;
2、delay取正整数:等待按键的时间,比如cv2.waitKey(25),就是等待25(milliseconds);(视频中一帧数据显示(停留)的时间)
cv2.waitKey(delay)返回值:
1、等待期间有按键:返回按键的ASCII码(比如:Esc的ASCII码为27);
2、等待期间没有按键:返回 -1;

在这里插入图片描述

图片处理

截取部分图片

一张图像并不需要全部的图像,截取感兴趣的部分。ROI。

import cv2
img = cv2.imread("F:/ImageProcessingLearning/documents/project/lianxi2.jpg",cv2.IMREAD_GRAYSCALE)
bufen=img[0:50,0:200]#长0~50,宽0~200.可能原来的图像是0——500
cv2.imshow("image",bufen)#image是给窗口指定一个名字,任意名字
cv2.waitKey(0)  # 设置等待时间,毫秒级,0表示任意键终止  (0)可以自己设定等待时间
cv2.destroyAllWindows()#可以定义函数cv_show来代替这三行代码

利用opencv中的两个函数来拆分通道(cv2.split)和合并通道(cv2.merge)

import cv2
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


img = cv2.imread("F:/ImageProcessingLearning/documents/project/bao1.png",cv2.IMREAD_COLOR)
bufen=img[100:500,100:400]
print(bufen)
# cv2.imshow("image",img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
#cv_show("bao",img)
b,g,r=cv2.split(img)
print(r)
changdu=r.shape
print(changdu)
img=cv2.merge((b,g,r))
changdu1=img.shape
print(changdu1)
cv_show("bao",bufen)

结果:

F:\Anaconda\python.exe C:/Users/Administrator/PycharmProjects/pythonProject1/main.py
[[[170 168 173]
  [170 168 173]
  [170 168 173]
  ...
  [171 185 205]
  [170 185 206]
  [171 185 206]]

 [[170 168 173]
  [170 168 173]
  [170 168 173]
  ...
  [170 184 204]
  [170 184 204]
  [171 185 206]]

 [[170 168 173]
  [170 168 173]
  [170 168 173]
  ...
  [170 184 205]
  [171 184 205]
  [171 185 206]]

 ...

 [[144 164 182]
  [145 166 183]
  [148 169 186]
  ...
  [ 55  40  36]
  [ 55  41  36]
  [ 52  39  34]]

 [[147 168 185]
  [149 171 188]
  [151 173 190]
  ...
  [ 55  40  37]
  [ 54  40  36]
  [ 54  40  35]]

 [[151 172 189]
  [153 174 191]
  [155 176 193]
  ...
  [ 56  41  39]
  [ 56  42  38]
  [ 56  42  37]]]
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]
(520, 647)
(520, 647, 3)

Process finished with exit code 0

在这里插入图片描述

多个窗口显示多张图片

cv2.namedWindow('window_name1', cv2.WINDOW_NORMAL)
cv2.imshow('window_name1', picture1)
cv2.namedWindow("window_name2", cv2.WINDOW_NORMAL)
cv2.imshow("window_name2", picture2)
cv2.waitKey()

```python
cv2.namedWindow('window1', cv2.WINDOW_NORMAL)
cv2.imshow('window1', replicate)
#设定图片的尺寸
cv2.resizeWindow('window1', 100, 100)
cv2.namedWindow("window2", cv2.WINDOW_NORMAL)
cv2.imshow("window2", reflect)

在这里插入图片描述

提取颜色通道

import cv2
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

img = cv2.imread("F:/ImageProcessingLearning/documents/project/bao1.png",cv2.IMREAD_COLOR)
bufen=img[100:500,100:400]
print(bufen)
# cv2.imshow("image",img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
#cv_show("bao",img)
b,g,r=cv2.split(img)
print(r)
changdu=r.shape
print(changdu)
img=cv2.merge((b,g,r))
changdu1=img.shape
print(changdu1)
cv_show("bao",bufen)

# img=cv2.merge((b,g,r))

#只保留R
cur_img=img.copy()
#[x,y,z],z的值是颜色通道,0是B,1是G,2是R。想要去掉什么直接就赋值为0,其他不动。
cur_img[:,:,0]=0
cur_img[:,:,1]=0
cv_show("ONLY_R",cur_img)

#只保留B
cur_img=img.copy()
#[x,y,z],z的值是颜色通道,0是B,1是G,2是R。想要去掉什么直接就赋值为0,其他不动。
cur_img[:,:,1]=0
cur_img[:,:,2]=0
cv_show("ONLY_B",cur_img)

#只保留G
cur_img=img.copy()
#[x,y,z],z的值是颜色通道,0是B,1是G,2是R。想要去掉什么直接就赋值为0,其他不动。
cur_img[:,:,0]=0
cur_img[:,:,2]=0
cv_show("ONLY_G",cur_img)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

边界填充&边界处理

函数介绍

import cv2
img = cv2.imread('F:/ImageProcessingLearning/documents/project/anjian.png',cv2.IMREAD_COLOR)
def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
# cv_show("anjian_picture",img)
top_size,bottom_size,left_size,right_size=(50, 50, 50, 50)
replicate=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder (img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT101)
wrap = cv2.copyMakeBorder (img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
#单个窗口逐个显示
cv_show("tianc1",replicate)
cv_show("tianc2",reflect)
cv_show("tianc3",reflect101)
cv_show("tianc4",wrap)
cv_show("tianc5",constant)
#多个窗口显示多张图片
cv2.namedWindow('window1', cv2.WINDOW_NORMAL)
cv2.imshow('window1', replicate)

cv2.namedWindow("window2", cv2.WINDOW_NORMAL)
cv2.imshow("window2", reflect)

cv2.namedWindow('window3', cv2.WINDOW_NORMAL)
cv2.imshow('window3', reflect101)

cv2.namedWindow("window4", cv2.WINDOW_NORMAL)
cv2.imshow("window4", wrap)

cv2.namedWindow('window5', cv2.WINDOW_NORMAL)
cv2.imshow('window5', constant)

cv2.waitKey()

结果:
在这里插入图片描述
函数介绍

画出PLT图来对比刚刚填充的图片,可以看到明显的区别

import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,'gray' ),plt.title("ORIGINAL")
plt.subplot (232),plt.imshow(replicate,'gray' ),plt.title( "REPLICATE" )
plt.subplot (233),plt.imshow(reflect,'gray' ),plt. title(' REFLECT' )
plt.subplot (234),plt.imshow (reflect101,'gray'), plt.title("reflect_101")
plt. subplot(235),plt. imshow(wrap,'gray' ),plt. title("WRAP")
plt. subplot (236),plt. imshow (constant,'gray' ),plt. title('CONSTANT' )
plt. show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值