- 一、 图像(各种图形和影像的总称)
- 1、像素、分辨率
- 2、灰度、通道、对比度
- 3、RGB模型
- 3、为什么很多图像识别将彩色图像灰度化?
- 二、 图像的取样与量化
- 三、上采样与下采样
- 1、上、下采样
- 2、常用的插值算法
图像是人类视觉的基础,是自然景物的客观反映,是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布,“像“是人的视觉系统所接受的图在人脑中所形成的印象或认识,照片、绘画、剪贴画、地图、书法作品、手写汉学、传真、卫星云图、影视画面、X光片、脑电图、心电图等都是图像。
1、像素、分辨率像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。一张图片由若干个像素点构成。
分辨率(解析度):
a) 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch)
b) PPI表示的是每英寸对角线上所拥有的的像素数目:
(X:长度像素数;Y:宽度像素数;Z:屏幕尺寸即对角线长度)
c) 屏幕尺寸指的是对角线长度
d)在生活中被混用,或者说错误的用做衡量图像内的像素点数量,手机拍的相片常用19201080描述图片的大小,其实这里的19201080不是分辨率。而是图片的大小,我们误用为分辨率就是图片的大小。
2、灰度、通道、对比度(1) 灰度:表示图像像素明暗程度的数值,也就是黑白图像中点的颜色深度。范围一般为0-255。白色为255,黑色为0。
(2通道:把图像分解成一个或多个颜色成分:
①单通道:一个像素点只需一个数值表示,只能表示灰度,0为黑色; (二值图&灰度图)
②三通道:RGB模式,把图像分为红绿蓝三个通道,可以表示彩色,全0表示黑色;
③四通道:RGBA模式,在RGB基础上加上alpha通道,表示透明度,alpha=0表示全透明
(3)对比度:指不同颜色之间的差别。对比度=最大灰度值/最小灰度值
3、RGB模型(1)色彩三原色(CMYK):品红、黄、青
光学三原色(RGB):红、绿、蓝
(2)颜色模型指的是某个三维颜色空间中的一个可见光子集,它包含某个色彩域的所有色彩。一般而言,任何一个色彩域都只是可见光的子集,任何一个颜色模型都无法包含所有的可见光。常见的颜色模型有RGB CIECMY/CMYK、(HSK NTSC、YcbCr、HSV、YUV 等。
(3)RGB转换为灰度图像的方法
(1)RGB值转化为浮点数
• 浮点数运算结果更精确,整数运算中会因丢弃小数部分可能导致颜色值严重失
真,计算过程越多越失真
• 将RGB值转化为[0,1]浮点数
• 二值化:
if (img_gray[i, j] <= 0.5):
img_gray[i, j] = 0
else:
img_gray[i, j] = 1
(2)opencv大坑之BGR
opencv对于读进来的图片的通道排列是BGR,而不是主流的RGB!谨记!
#opencv读入的矩阵是BGR,如果想转为RGB,可以这么转
img4 = cv2.imread('1.jpg')
img4 = cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)
(3)• 频率: 灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。
• 高频、低频
• 幅值: 幅值是在一个周期内,交流电瞬时出现的最大绝对值,也是一个正弦波,波峰到波谷的距离的一半
• 数字图像:计算机保存的图像都是一个一个的像素点,称为数字图像。
• 图像数字化过程由图像的取样与量化来完成。
• 取样:就是要用多少点来描述一幅图像,取样结果质量的高低就是用图像的分辨率来衡量的
• 量化:是指要使用多大范围的数值来表示图像采样之后的一个点。
• 数字化坐标值称为取样,数字化幅度值称为量化。
一张图片在手机或PC上看起来边缘是连续的如图左边一样,但是放大后再去观察,边缘都是不连续的,由一个个小格子组成,如图右边.
在取样时,若横向的像素数(列数)为M ,纵向的像素数(行数)为N,则图像总像素数为M*N个像素。
(1)缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个: 1、使得图像符合显示区域的大小; 2、生成对应图像的缩略图。
(2)放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。
(3)图像插值也可用来缩小图像。
上采样原理:内插值
下采样原理: (M/s) * (N/s)
这部分内容网上已经有很多博客讲的很清楚了,我就不做重复性工作了,把自己学习过程中看的几篇觉得不错的博客链接分享给大家进行学习。
参考学习(必看):https://blog.csdn.net/qq_38463737/article/details/119898254
(1)最邻近插值(也称最近邻插值算法)
示例代码:
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)单线性插值算法
加权:权即由测量值精度的不同在平差计算中所取的权重不同。精度越高,权越大。“加权”的意思就是“乘以权重”,即“乘以系数”的意思。
(3)双线性插值算法
在x方向做插值:
在y方向做插值:
综合起来:
由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。
如果源图像和目标图像的原点(0, 0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下:
那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。
最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距。
双线性差值法的计算比最邻近插值法复杂,计算量较大,但没有灰度不连续的缺点,图像看起来更光滑。
示例代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
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()
本文章参考了百度百科、他人技术博客、八斗学院免费教程资料、计算机视觉书籍等综合整理而来,如有侵权,联系删除!水平有限,欢迎各位指导交流!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)