计算机视觉基础 数字图像
文章目录1.图像2.图像的取样与量化3.上采样与下采样常用的插值方法最邻近插值(The nearest interpolation)双线性插值4.直方图5.滤波1.图像像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。分辨率(解析度):1.图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch)2.PPI表示的是每英寸对角线上所拥有的的像素
1.图像
像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。
分辨率(解析度):
1.图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch)
2.PPI表示的是每英寸对角线上所拥有的的像素数目:
(X:长度像素数;Y:宽度像素数;Z:屏幕大小)
3.屏幕尺寸指的是对角线长度
灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度。范围一般为0-255。白色为255,黑色为0。
通道:把图像分解成一个或多个颜色成分:
①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色;(二值图{取值只有0和1}&灰度图{取值在0~255之间})
②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;
Note:opencv对于读进来的图片的通道排列是BGR,而不是RGB!
③四通道:RGBA模式,在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明
对比度:指不同颜色之间的差别。对比度=最大灰度值/最小灰度值
RGB转换为Gray
彩色图片灰度化
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import cv2
# 灰度化
img = cv2.imread("lenna.png")
cv2.imshow("123",img)
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)
cv2.waitKey(0)
频率:灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。(高频,低频)
幅值:幅值是在一个周期内,交流电瞬时出现的最大绝对值,也是一个正弦波,波峰到波谷的距离的
一半。
2.图像的取样与量化
数字图像:计算机保存的图像都是一个一个的像素点,称为数字图像。
图像数字化过程由图像的取样与量化来完成。
取样:就是要用多少点来描述一幅图像,取样结果质量的高低就是用图像的分辨率来衡量的。
量化:是指要使用多大范围的数值来表示图像采样之后的一个点。
数字化坐标值称为取样,数字化幅度值称为量化。
3.上采样与下采样
上采样和下采样:缩小图像和放大图像。(可以通过插值实现)
常用的插值方法
最邻近插值(The nearest interpolation)

import cv2
import numpy as np
def function(img):
height, width, channels = img.shape
emptyImage = np.zeros((800, 800, channels), np.uint8)
sh = 800 / height
sw = 800 / width
for i in range(800):
for j in range(800):
x = int(i / sh)
y = int(j / sw)
emptyImage[i, j] = img[x, y]
return emptyImage
img = cv2.imread("lenna.png")
zoom = function(img)
print(zoom)
print(zoom.shape)
cv2.imshow("nearest interp", zoom)
cv2.imshow("image", img)
cv2.waitKey(0)
双线性插值
可以转换为大致两次单线性插值
单线性插值

解释上2张图片:已知X0和X1两点的坐标以及X的横坐标,求X的纵坐标。(简单点说就是在X位置进行插值)
双线性插值
解释:尝试通过Q这4个点求出P的值。转化为先通过两个Q分别求出R1,R2的值,再通过R1和R2的值求出P点的值。

import numpy as np
import cv2
'''
python implementation of bilinear interpolation
'''
def bilinear_interpolation(img,out_dim):
src_h, src_w, channel = img.shape
dst_h, dst_w = out_dim[1], out_dim[0]
print ("src_h, src_w = ", src_h, src_w)
print ("dst_h, dst_w = ", dst_h, dst_w)
if src_h == dst_h and src_w == dst_w:
return img.copy()
dst_img = np.zeros((dst_h,dst_w,3),dtype=np.uint8)
scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_h
for i in range(3):
for dst_y in range(dst_h):
for dst_x in range(dst_w):
# find the origin x and y coordinates of dst image x and y
# use geometric center symmetry
# if use direct way, src_x = dst_x * scale_x
src_x = (dst_x + 0.5) * scale_x-0.5
src_y = (dst_y + 0.5) * scale_y-0.5
# find the coordinates of the points which will be used to compute the interpolation
src_x0 = int(np.floor(src_x))
src_x1 = min(src_x0 + 1 ,src_w - 1)
src_y0 = int(np.floor(src_y))
src_y1 = min(src_y0 + 1, src_h - 1)
# calculate the interpolation
temp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i]
temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i]
dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)
return dst_img
if __name__ == '__main__':
img = cv2.imread('lenna.png')
dst = bilinear_interpolation(img,(700,700))
cv2.imshow('bilinear interp',dst)
cv2.waitKey()
4.直方图
定义:图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。(类似算法里桶排序的思想)
直方图均衡化



笔记:上图是手撸数据。pix表示像素值,Ni表示像素值为Pix的数量,根据公式可以计算出Pi,sumPi是计算前缀和的。
5.滤波
和卷积类似,但是不等于卷积。
卷积操作也是卷积核与图像对应位置的乘积和。但是卷积操作在做乘积之前,需要先将卷积核翻转180度,之后再做乘积。
卷积负责提取图像中的局部特征
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)