Skip to content

Latest commit

 

History

History
265 lines (210 loc) · 5.96 KB

600-967295-灰度图像矩阵结构.sy.md

File metadata and controls

265 lines (210 loc) · 5.96 KB
show version enable_checker
step
1.0
true

opencv

回忆

  • 上次研究了图像的shape
    • 高度
    • 宽度
    • 通道数
  • 并且把图像从RGB色彩模式修改为灰度色彩模式
    • 结果仍然是三维列表
  • 真正的灰度图也是三维列表吗?🤔

素材

图片描述

  • 准备素材图片

图片描述

  • 重启蓝桥后会发现gear.jpg

以灰度的方式读取图像

import cv2                                                     
image = cv2.imread("/home/shiyanlou/gear.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)                                      
print(image)                                                   
print(image.shape)                                                 
key = cv2.waitKey()                                            
if key & 0xFF == ord("q"):                                     
    cv2.destoryAllWindows()
  • 运行结果

图片描述

  • 降维成二维数组了吗?

数据类型与图像维度

import cv2
image = cv2.imread("/home/shiyanlou/gear.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
height, width = image.shape
print(image)
print("type(image)====", type(image))
print("image.ndim====", image.ndim)
print("image.dtype====", image.dtype)
print("height====",height)
print("width====",width)
print("image.size====", image.size)
key = cv2.waitKey()
if key & 0xFF == ord("q"):
    cv2.destroyAllWindows()
  • 运行结果

图片描述

  • image的类型是numpy数组
    • 二维数组
    • 数据类型为8-bit的无符号整数
  • 注意shape中
    • 先得到的是高度值
    • 后得到的是宽度值
  • 具体数值是什么含义呢?

查看具体像素信息

import cv2 
image = cv2.imread("gear.jpg",cv2.IMREAD_GRAYSCALE)
cv2.imshow("image",image)
height, width = image.shape
print(image)
print("image[0,0]=======",image[0][0])
print("image[0,1]=======",image[0][1])
print("image[1,0]=======",image[1][0])
print("image[1,1]=======",image[1][1])                                      
key = cv2.waitKey()
if key & 0xFF == ord("q"):
    cv2.destroyAllWindows()
  • 查看图像时
    • 可以用手触控板捏合或放大图像左上角
      • 第一维度是纵坐标y
      • 第二维度是横坐标x

图片描述

  • 可以做一个单像素的jpg文件吗?

单像素的图片

  • 观察矩阵效果
import cv2 
import numpy as np
vector = np.zeros((1,1),np.uint8)
print("vector=======",vector)
print("vector[0]====",vector[0])
print("vector[0][0]====",vector[0][0])
cv2.imshow("vector",vector)
vector[0,0] = 255 
print("vector=======",vector)
print("vector[0]====",vector[0])
print("vector[0][0]====",vector[0][0])
cv2.imshow("vector2",vector)
cv2.waitKey()
cv2.destroyAllWindows()
  • 制作了
    • 一个纯黑像素
    • 一个纯白像素

图片描述

  • 可以让像素更复杂一些吗?

复杂像素

  • 设置一个3*1的向量矩阵
    • 并观察
import cv2
import numpy as np
matrix = np.zeros((3,1),np.uint8)
print(matrix)
cv2.imshow("matrix",matrix)
for n in range(3):
    matrix[n,0] = int(256/3*n)
print("="*50)
print(matrix)
cv2.imshow("matrix_2",matrix)
cv2.waitKey()
cv2.destroyAllWindows()
  • 都是 3 * 1的矩阵
    • 一个是纯黑
    • 另一个是渐变色

图片描述

  • 可以做2*2矩阵吗?

2*2的矩阵

import cv2
import numpy as np
matrix = np.zeros((2,2),np.uint8)
print(matrix)
cv2.imshow("matrix",matrix)
for i in range(2):
    for j in range(2):
        matrix[i,j] = int(256/4 * (i*2 + j ))
print("="*50)
print(matrix)
cv2.imshow("matrix_2",matrix)
cv2.waitKey()
cv2.destroyAllWindows()
  • 并观察

图片描述

  • 第一维度 是 行
    • 第二维度 是 列
  • 做一个更大结构的画布

经典5*7

import cv2
import numpy as np

canvas = np.zeros((7,5),np.uint8)
print(canvas)
cv2.imshow("canvas",canvas)
cv2.waitKey()
cv2.destroyAllWindows()
  • 结果

图片描述

写字

import cv2
import numpy as np

canvas = np.zeros((7,5),np.uint8)
cv2.putText(canvas,"0",(0,5),cv2.FONT_HERSHEY_DUPLEX,0.2,255,1)
print(canvas)
cv2.imshow("canvas",canvas)
cv2.waitKey()
cv2.destroyAllWindows()
数值 颜色
255 纯白
0 纯黑

图片描述

  • 可以通过滚动条控制输出的字符吗?

输出字符7*5

import cv2
import numpy as np
def callback(value):
    num = cv2.getTrackbarPos('ascii', 'canvas')
    canvas = np.zeros((7,6),np.uint8)
    print(num,chr(num),sep=":")
    cv2.putText(canvas,chr(num),(0,5),cv2.FONT_HERSHEY_SIMPLEX,0.2,255,1)
    print(canvas)
    cv2.imshow('canvas', canvas)

cv2.namedWindow('canvas', cv2.WINDOW_NORMAL)
cv2.createTrackbar('ascii', 'canvas', 0, 127, callback)
canvas = np.zeros((7,6),np.uint8)
cv2.putText(canvas,"0",(0,5),cv2.FONT_HERSHEY_DUPLEX,0.2,255,1)
cv2.imshow("canvas",canvas)
cv2.waitKey()
cv2.destroyAllWindows()
  • 效果

图片描述

总结

  • 这次了解了一个纯灰度图的结构
    • 纯灰度图被理解为一个二维矩阵
      • 第一维 是 高度y
      • 第二维 是 宽度x
  • 在图像中的每一个点
    • 对应的像素
    • 都可以映射到一个uint-8
    • 无符号整型1字节(8-bit)
  • 一个图像 在opencv里 就对应一个矩阵
    • 这矩阵 就是 图像的基础
  • 这矩阵 有什么门道呢?
    • 怎么玩呢??🤔
  • 我们下次再说 👋