Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)

我们上一篇简要的了解了一下机器学习的算法基础,也就是回归分析。今天我们就来看一看OpenCV的使用。

第三篇

  • 一、三维矩阵存储图片--在Python中使用OpenCV
  • 二、OpenCV读取图片
  • 三、使用Numpy对图像进行编辑
  • 四、OpenCV的卷积核处理
    • 使用[3,3]卷积核的结果如下:
    • 那么我们也有别的卷积特征提取方式,例如高斯模糊:

一、三维矩阵存储图片–在Python中使用OpenCV

在正式讲解OpenCV在Python中的使用之前,我们需要了解一个概念,就是使用OpenCV读取任何图片均是将其转化成二维矩阵进行。
例如,读取一张图片:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第1张图片

jpg = cv2.imread("1.jpg")
print(jpg.shape)

结果就是:(435, 676, 3),也就是说,图片被读取成一个大小为[435,676,3]的矩阵,这是一个三维矩阵,由3个[435,676]的矩阵构成。
例如打印第一个矩阵:

print(jpg[:,:,0])

Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第2张图片
就是一个[435,676]的矩阵。也可以打印出图片:
代码如下:

jpg = cv2.imread("1.jpg")
jpg1 = jpg[:,:,0]
cv2.imshow("jpg1",jpg)
cv2.waitKey()

Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第3张图片

二、OpenCV读取图片

现在,我们就来看一看图片是怎么以矩阵的形式存储在介质中的:
例:

img = np.mat(np.zeros((300,300))) # 创建一个长、宽各为300的矩阵,各个点的值为0
cv2.imshow("test",img)
cv2.waitKey()

Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第4张图片
那么这就是一张一维的黑色图片,现实生活中,图片一般由红(R)、绿(G)、蓝(B)三种颜色组成,也就是三原色。因而图片显示时,是3通道的(矩阵的第三维即颜色通道),也就是说,我们可以给每一个维度不同的数值,来存储同一张图片。
至于想更深入了解三维矩阵存储图片的读者。可以看一看这篇博客:
关于三通道彩色图像的存储方式理解

那么数组能不能转换成矩阵?
当然是可以的:

image = np.mat(np.zeros((300,300)))
imageByteArray = bytearray(image)
print(imageByteArray)
imageBGR = np.array(image).reshape(200,450)
cv2.imshow("cool",imageBGR)
cv2.waitKey()

print(imageByteArray)的结果是:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第5张图片
也就是全黑的意思。
那么转换成图像就是cv2.imshow("cool",imageBGR)的结果:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第6张图片
我们了解了这些之后,自然也就明白,可以随机生成一副图片:

randomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = np.array(randomByteArray).reshape(300,400)
cv2.imshow("cool",flatNumpyArray)
cv2.waitKey()

结果如图:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第7张图片
这个就是随机生成的一个120000的数组,重构成[300,400]的矩阵之后显示的结果。

三、使用Numpy对图像进行编辑

那么,我们可以不可以定向的改变图片的颜色?可以:
生成一个像素点10*10的白块加黑块:

img = np.zeros((300,300))
img[0:10,0:10] = 255
cv2.imshow("img",img)
cv2.waitKey()

结果:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第8张图片
一行或者一列我们也可以操作:

img = np.zeros((300,300))
img[:,10] = 255
img[10,:] = 255
cv2.imshow("img",img)
cv2.waitKey()

Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第9张图片

四、OpenCV的卷积核处理

在OpenCV以及日常的图像处理中,卷积核是一种常用的图像处理工具。其主要的方法是通过确定的核块来检测图像的某个区域,之后根据所检测的像素与其周围存在的像素的亮度差值来改变像素明亮度。
例如还是这张图为例:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第10张图片

使用[3,3]卷积核的结果如下:

kernel33_D = np.array([[1,1,1],
    [1,-8,1],
    [1,1,1]])    # 这个核的作用就是减少中心像素的亮度
# 另一个卷积核刚好相反:
kernel33 = np.array([[-1,-1,-1]
    ,[-1,8,-1],
    [-1,-1,-1]])  # 如果亮度差距大,本身图像的中央亮度小,经过卷积核之后,中央像素的亮度增加
import numpy as np
import cv2
from scipy import ndimage
kernel33_D = np.array([[1,1,1],
    [1,-8,1],
    [1,1,1]])    # 这个核的作用就是减少中心像素的亮度
img = cv2.imread("1.jpg",0)
linghtImg = ndimage.convolve(img,kernel33_D)
cv2.imshow("img",linghtImg)
cv2.waitKey()

那么我们也有别的卷积特征提取方式,例如高斯模糊:

import numpy as np
import cv2
from scipy import ndimage
img = cv2.imread("1.jpg",0)
blurred = cv2.GaussianBlur(img,(11,11),0)
gaussImg = img - blurred
cv2.imshow("img",gaussImg)
cv2.waitKey()

这个是运行结果,还挺好看的:
Python深度学习:计算机视觉处理库OpenCV、Numpy编辑图片、高斯模糊处理(读书笔记)_第11张图片

那么今天的读书笔记就分享到这里了,我们下次再见!

你可能感兴趣的:(深度学习入门,opencv,计算机视觉,python,numpy)