1. imread后的返回值其实是一个矩阵,这个矩阵shape是(高,宽,维度)
2. 通过imread获得的src矩阵,每个元素值是(B,G,R)而不是常规的(R,G,B)
3. 更改原始图像的数据时候,记住的一个前提是原始图像是一个矩阵。
4. 数据类型(dtype),uint8正好满足0-255的范围
5. 图像的裁剪本质上是对src矩阵操作,选取src矩阵中的部分区域即为裁剪,使用切片就行,src[175:240,180:300](记住这里是先高值,再宽值)
6. python的切片是对原始数据的引用,修改切片后的数据会更改原始数据,并非是拷贝。
7. 图片的镜像:本质上也是对原始图像矩阵做操作,注意最终的行列值关系。(结果是lena上下镜像)。

OpenCV 点密度 opencv的shape_原始数据

height = src.shape[0]
width = src.shape[1]

# 创建一个原图2倍高度的画布
newHight = height*2;
dst = np.zeros((newHight,width,3),np.uint8);

# 将原图的像素值 填到 画布中
for row in range(height):
    for col in range(width):
        # 从原图中获取颜色值
        color = src[row,col];
        # 填充到画布上部分
        dst[row,col] = color

        # 倒序输出
        dst[newHight-row-1,col] = color

    # 每画完一行刷新一次
    cv.waitKey(50)
    cv.imshow("dst", dst);
8. 图像的缩放:可采用 最近领域差值、双线性差值、像素关系重采样、立方插值 OpenCV默认的resize()方法是双线性差值。使用最近领域法对图片进行缩放代码如下(缩小和放大都行!)
# 获取图片信息
height = src.shape[0]
width = src.shape[1]

# 定义缩放系数
scale = 3

# 根据缩放系数创建一个画布
new_height = int(height*scale)
new_width = int(width*scale)

dst = np.zeros((new_height,new_width,3),np.uint8);

# 填充画布的颜色值
for row in range(new_height):
    for col in range(new_width):


        # 当前画布 1*2 --》原图 2*4     3*3 0.5
        # 推算出原来的行和列的位置
        oldRow = int(row/scale)
        oldCol = int(col/scale)

        color = src[oldRow,oldCol]

        # 当前画布 1*2 --》 2*4
        dst[row,col] = color;
9. 图像的平移:借助平移矩阵,代码如下,注意其中的矩阵乘法和齐次矩阵设计
import cv2 as cv
import numpy as np

img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 创建一个和原图同样大小的矩阵
dstImg = np.zeros((height,width,3),np.uint8)

for row in range(height):
    for col in range(width):
        # 补成齐次坐标
        sourceMatrix = np.array([col,row,1])

        matrixB = np.array([[1,0,50],
                            [0,1,100]])
        # 矩阵相乘
        dstMatrix = matrixB.dot(sourceMatrix.T)
        # 从原图中获取数据
        dstCol = int(dstMatrix[0])
        dstRow = int(dstMatrix[1])
        # 防止角标越界
        if dstCol < width and dstRow < height:
            dstImg[dstRow,dstCol] = img[row,col]

# 显示图片出来
cv.imshow("dstImg",dstImg)
cv.waitKey(0)
10. 图像的平移:通过调用api方式,主要是warpAffine函数
cv.warpAffine(原始图像,变换矩阵,(输出图像高度,输出图像宽度))
import cv2 as cv
import numpy as np

img = cv.imread("img/lena.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 定义位移矩阵
matrixShift = np.float32([
                [1,0,50],
                [0,1,100]
              ])
# 调用api
dstImg = cv.warpAffine(img,matrixShift,(width,height))

cv.imshow("dst",dstImg)
cv.waitKey(0)
11. 图像旋转:借助getRotationMatrix2D()函数
import cv2 as cv

img = cv.imread("img/itheima.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 定义仿射矩阵: 参数1:中心点, 参数2:旋转角度,参数3:缩放系数
# 注意这里矩阵中的中心点,先宽后高,具体过程是先绕0,0点旋转,再平移到中心点
matrixAffine = cv.getRotationMatrix2D((width * 0.5, height * 0.5), 45, 0.5)
# 进行仿射变换
dstImg = cv.warpAffine(img, matrixAffine, (width, height))

cv.imshow("dstImg",dstImg)
cv.waitKey(0)
12. 图像的仿射变换,其实就是计算矩阵A到矩阵B的变换矩阵,得到变换矩阵后,再对原始图像应用此矩阵进行变换即可。
import cv2 as cv
import numpy as np

img = cv.imread("img/itheima.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 定义图片 左上角,左下角 右上角的坐标
matrixSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
# 将原来的点映射到新的点
matrixDst = np.float32([[50,100],[300,height-200],[width-300,100]])
# 将两个矩阵组合在一起,仿射变换矩阵
matrixAffine = cv.getAffineTransform(matrixSrc,matrixDst)

dstImg = cv.warpAffine(img,matrixAffine,(width,height))

cv.imshow("dstImg", dstImg)

cv.waitKey(0)
13. 图像的上采样和下采样操作,注意其和resize()函数的区别。

我们可以看到,当我们对图片进行下采样操作的时候,即使图片变得非常小,我们任然能够看到它的轮廓,这对后面我们进行机器学习是非常重要的一步操作,而当我们直接使用resize进行操作的时候,我们发现图片似乎不能完全表示它原有的轮廓,出现了很多的小方块!

下采样和resize()函数对比代码如下:

import cv2 as cv;

src_img = cv.imread("img/lena.jpg",cv.IMREAD_COLOR);
imgInfo = src_img.shape
height = imgInfo[0]
width = imgInfo[1]

pry_down1 = cv.pyrDown(src_img)
cv.imshow("down1",pry_down1)
pry_down2 = cv.pyrDown(pry_down1)
cv.imshow("down2",pry_down2)
pry_down3 = cv.pyrDown(pry_down2)
cv.imshow("down3",pry_down3)
pry_down4 = cv.pyrDown(pry_down3)
cv.imshow("down4",pry_down4)

pyr_up1 = cv.pyrUp(pry_down1)
cv.imshow("up1",pyr_up1)
pyr_up2 = cv.pyrUp(pry_down2)
cv.imshow("up2",pyr_up2)
pyr_up3 = cv.pyrUp(pry_down3)
cv.imshow("up3",pyr_up3)
pyr_up4 = cv.pyrUp(pry_down4)
cv.imshow("up4",pyr_up4)


# 对比resize
img2 = cv.resize(src_img,(int(height/2),int(width/2)))
cv.imshow("img1/2",img2)

img4 = cv.resize(src_img,(int(height/4),int(width/4)))
cv.imshow("img1/4",img4)

img8 = cv.resize(src_img,(int(height/8),int(width/8)))
cv.imshow("img1/8",img8)

img16 = cv.resize(src_img,(int(height/16),int(width/16)))
cv.imshow("img1/16",img16)

cv.waitKey(0)
cv.destroyAllWindows()