我们上一篇简要的了解了一下机器学习的算法基础,也就是回归分析。今天我们就来看一看OpenCV的使用。
在正式讲解OpenCV在Python中的使用之前,我们需要了解一个概念,就是使用OpenCV读取任何图片均是将其转化成二维矩阵进行。
例如,读取一张图片:
jpg = cv2.imread("1.jpg")
print(jpg.shape)
结果就是:(435, 676, 3),也就是说,图片被读取成一个大小为[435,676,3]的矩阵,这是一个三维矩阵,由3个[435,676]的矩阵构成。
例如打印第一个矩阵:
print(jpg[:,:,0])
就是一个[435,676]的矩阵。也可以打印出图片:
代码如下:
jpg = cv2.imread("1.jpg")
jpg1 = jpg[:,:,0]
cv2.imshow("jpg1",jpg)
cv2.waitKey()
现在,我们就来看一看图片是怎么以矩阵的形式存储在介质中的:
例:
img = np.mat(np.zeros((300,300))) # 创建一个长、宽各为300的矩阵,各个点的值为0
cv2.imshow("test",img)
cv2.waitKey()
那么这就是一张一维的黑色图片,现实生活中,图片一般由红(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)
的结果是:
也就是全黑的意思。
那么转换成图像就是cv2.imshow("cool",imageBGR)
的结果:
我们了解了这些之后,自然也就明白,可以随机生成一副图片:
randomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = np.array(randomByteArray).reshape(300,400)
cv2.imshow("cool",flatNumpyArray)
cv2.waitKey()
结果如图:
这个就是随机生成的一个120000的数组,重构成[300,400]的矩阵之后显示的结果。
那么,我们可以不可以定向的改变图片的颜色?可以:
生成一个像素点10*10的白块加黑块:
img = np.zeros((300,300))
img[0:10,0:10] = 255
cv2.imshow("img",img)
cv2.waitKey()
img = np.zeros((300,300))
img[:,10] = 255
img[10,:] = 255
cv2.imshow("img",img)
cv2.waitKey()
在OpenCV以及日常的图像处理中,卷积核是一种常用的图像处理工具。其主要的方法是通过确定的核块来检测图像的某个区域,之后根据所检测的像素与其周围存在的像素的亮度差值来改变像素明亮度。
例如还是这张图为例:
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()
那么今天的读书笔记就分享到这里了,我们下次再见!