数字图像
1. 图像
1.1 基本概念
-
像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。
-
分辨率(解析度)
① 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch)
② PPI表示的是每英寸对角线上所拥有的的像素数目:
③ 屏幕尺寸指的是对角线长度
④ 在生活中被混用,或者说错误的用做衡量图像内的像素点数量。
-
灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度。范围一般为0-255。白色为255,黑色为0。
-
通道:把图像分解成一个或多个颜色成分:
①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色; (二值图&灰度图)
②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;
③四通道:RGBA模式,在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明
-
频率: 灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。高频、低频
-
幅值: 幅值是在一个周期内,交流电瞬时出现的最大绝对值,也是一个正弦波,波峰到波谷的距离的一半。
-
颜色模型———RGB模型
RGB颜色模型是三维直角坐标颜色系统中的一个单位正方体
在正方体的主对角线上,各原色的量相等,产生由暗到亮的白色,即灰度。
正方体的其他6个角点分别为红、黄、绿、青、蓝和品红
1.2 RGB转Gray
-
**转换原因:**浮点运算更精准,整数运算会因为丢小数部分导致颜色值严重失真,计算过程越多越失真。
-
根据通道转换方法:
- 浮点算法:Gray=R0.3+G0.59+B0.11
- 整数方法:Gray=(R30+G0.59+B11)/100
- 移位方法:Gray=(R76+G151+B*28)>>8
- 平均值法:Gray=(R+G+B)/3
- 仅取绿色:Gray=G
-
RGB转换为浮点数(RGB转化为[0,1]之间的小数)
二值化:(用坐标分别除以最大值255就可以得到0到1之间的数)
# 二值化 # 笨方法 if(img_gray[i,j]<=0.5): img_gray[i,j]=0 else: img_gray[i,j]=1 # 使用函数 img_binary = np.where(img_gray >= 0.5, 1, 0)
-
**注意:**再使用openCV时,openCV对于读进来的图片的痛到排列是BGR,不是RGB
BGR转为RGB的方法:
img = cv2.imread('1.jpg')# 读取图像为BGR顺序 img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# 将图像转为RGB顺序
cv2.cvtColor()
:颜色空间转换函数函数构成:
cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
参数说明:
@frame为要进行处理的图片;
@cv2.COLOR_BGR2RGB要进行的色彩转换方式;
灰度化:
img_gray = rgb2gray(img) # img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # img_gray = img
1.3【 代码实现】彩色图像的灰度化、二值化
# -*- coding: utf-8 -*-
"""
@author: Michael
彩色图像的灰度化、二值化
"""
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt
import cv2
# RGB转Gray
img = cv2.imread("1.1.png")
h, w = img.shape[:2] # 获取图片的high和wide
img_gray = np.zeros([h, w], img.dtype) # 创建一张和当前图片大小一样的单通道图片
for i in range(h):
for j in range(w):
m = img[i, j] # 取出当前high和wide中的BGR坐标
img_gray[i, j] = int(m[0] * 0.11 + m[1] * 0.59 + m[2] * 0.3) # 将BGR坐标转化为gray坐标并赋值给新图像,这里直接套用公式
print(img_gray)
print("image show gray: %s" % img_gray)
cv2.imshow("image show gray", img_gray)
plt.subplot(221) # 显示多图像,为2*2的从左到右从上到下的显示,此图像在第一个位置
img = plt.imread("1.1.png")
# img = cv2.imread("lenna.png", False)
plt.imshow(img)
print("---image lenna----")
print(img)
# 灰度化
img_gray = rgb2gray(img)
# img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# img_gray = img
plt.subplot(222) # 显示多图像的第二个位置
plt.imshow(img_gray, cmap='gray')
print("---image gray----")
print(img_gray)
# 二值化
# rows, cols = img_gray.shape
# for i in range(rows):
# for j in range(cols):
# if (img_gray[i, j] <= 0.5):
# img_gray[i, j] = 0
# else:
# img_gray[i, j] = 1
img_binary = np.where(img_gray >= 0.5, 1, 0)
print("-----imge_binary------")
print(img_binary)
print(img_binary.shape)
plt.subplot(223) # 显示多图像的第三个位置
plt.imshow(img_binary, cmap='gray')
plt.show()
2. 图像的取样和量化
2.1 基本概念
-
数字图像:计算机保存的图像都是一个一个的像素点,称为数字图像。
-
图像数字化过程由图像的取样与量化来完成。
-
取样:就是要用多少点来描述一幅图像,取样结果质量的高低就是用图像的分辨率来衡量的
-
量化:是指要使用多大范围的数值来表示图像采样之后的一个点。(也就是图像颜色的取值范围)
-
数字化坐标值称为取样,数字化幅度值称为量化
-
在取样时,若横向的像素数(列数)为M ,纵向的像素数(行数)为N,则图像总像素数为
M*N个像素。