2016-04-12 20:36:48 qq_20823641 阅读数 13865

基础储备知识列表(图像必备基础)

1.     图像会表示成一个2D实数矩阵f(x,y),也称为是图像在那个像素的灰度或者是亮度,对于double类型的是0.0黑      1.0白,对于unit8类型是0黑,255是白

2.     图像常见的数字形式编码:位图(栅格)和矢量

3.     图像表示

        二值化图像,1比特图像(一个像素是1比特)0 1
       灰度图像,8比特图像(1个像素是8比特)0-255
       彩色图像24比特(RGB各占8比特),同时也会有第四通道,提供对每个像素透明性的测度

      索引图像 24比特,其中每个像素给出的索引和索引所指示的彩色调色板中的元素R G B的值

4.     基本术语

     图像拓扑:常用于二值图像并借助形态学

     领域:围绕一个给定像素的周围构成它的领域,4领域 8领域

     邻接;通路;连接性;组元

5.     图像处理分为3个层次

     底层:基本操作(噪声消除,对比度增强),其中输入和输出都是图像

     中层:从图像中提取属性(如边缘,轮廓,区域)

     高层:对一个场景的内容进行分析和解释

6.     图像的处理分为:空间域和频域

     空间域:

     全局(点)操作

     面向领域的操作,卷积

     结合多幅图像的操作

             频域:

7.     图像的采集需要光,光可用电磁波或者粒子秒速,一个光子是一个微小的电磁振动能量包,可以用波长和频率来刻画,波长乘以频率等于波传播的速度,人类的视觉系统(HVS)对波长在400-700nm,1nm=10-9m

8.     彩色编码和表达

      彩色可使用3个数值分量和恰当的增加权函数来编码。最简单的编码方式就是像素的RGB

9.     人对光的感知以及对颜色的感知常用3个参数来描述:

      辉度:对于发光强度的主观感受

     色调:一个视感觉的属性,对应区域是否类似于一个感知的彩色,红绿蓝或者是组合

     饱和度:对一个区域用与其亮度成比例来判断的彩色行,对光源白色性的描述

     注:亮度可以用红绿蓝的加权和来计算

10.   数字图像处理的硬件:采集装置,负责捕获数字化图像或视频序列camera link。当相机产生模拟视频输出时,需要使用一个图像数字化器(图像采集卡)将其转化成数字格式;

      处理装置,计算机;显示和硬拷贝设备;存储设备,光盘。

      数学图像处理的软件,matlab c++

11.   图像传感器:将电磁辐射能量转换为可以处理、显示和解释成图像的电信号。主要是基于CCD(电荷耦合装置)和CMOS(互补型金属氧化物半导体器件)工艺。

      相机长常用的是CCD传感器,他们不受几何失真的影响并对入射光有线性的响应,一个CCD传感器由一组光敏单元构成,用硅制造,每个能产生正比于落在上面光密度的电压。一个感光单元具有一个约10^6能量载体的有限能力,这限制了被成像物体的明度上限,一个饱和的感光单元会溢出,从而影响它相邻单元并导致成为渗色的缺陷

     一个CCD相机有时候插入一个计算机板子,称为帧缓存,它包括对相机采集的图像快速访问的内存(典型的是每幅图像0.1ms),图像在被采集和临时存储在帧缓存后,将被处理货复制到长时存储设备中。

    在单CCD的相机中,使用具有对每种光基色(红蓝绿)不同感光单元的三色成像仪,其中感光单元排列成贝叶斯模式,这样,每个像素实际上仅仅记录了三个基色之一。

     COMS传感器是分层传感器堆栈,在网格的每个位置都有分层的对所有三种基色都敏感的光电传感器,在每个像素只有一个仅对一种基色敏感的光电传感器。

相机的镜头有2个重要的参数是它的放大倍数和光收集能力

12.   图像数字化:(时间或者空间)采样、(幅度上)量化

     采样就是去离散的值,有采样率,采样率要大于信号中最高频率分量的2倍(乃奎斯特准则),采样模式

     量化是将一个连续变化函数用一个离散集合的量化级替换的过程。图像的量化级是灰度级,量化理解为映射,就是把一个范围的灰度值隐射到单个点,例如0-255可以均匀量化为4,1代表0-64 2代表65-128 3代表129-1924代表193-255

     空间分分辨率;描述衣服图像中像素密度,空间分辨率高,将有越多的像素用来显示一副固定尺寸的图像,每英寸点数dpi表示,空间分辨率降低的时候,质量变化不是很明显,但是像素化,锯齿化 细节的损失,甚至会出现莫尔模式

     灰度分辨率是HVS能辨别的亮度级的最小变化,对于单色图像每个像素8比特是在主观质量和实际实现(每个像素值对应一个字节对应)中较好的平衡

 


2018-11-26 19:20:03 weixin_42956785 阅读数 227

tensorflow图像处理函数

必备知识点: 一张RGB色彩模式的图像可以看成一个三维矩阵,矩阵中的每一个数表示了图像上不同的位置,不同颜色的亮度。然而在图像储存的时候,并不是直接记录这些矩阵中的数字,而是记录经过压缩之后的结果,故在打开一张照片的时候则需要进行解码的过程
流程图:
在这里插入图片描述
tensorflow提供了对jpeg和png格式图像的编码/解码函数
使用的图像:
在这里插入图片描述

读取图像

import matplotlib.pyplot as plt  #python画图工具
import tensorflow as tf
#调用tf.gfile.GFile(路径,读取方式)函数,如果用r去read读取文件,会有编码不配的错误,所以这里我采用rb来read
img_raw_data = tf.gfile.GFile("C:\\Users\\huanshangfeng\\Desktop\\tf\\picture\\1.jpeg",'rb').read()

解码图像,并显示图像

sess = tf.InteractiveSession() #创建会话,等价于with tf.Session() as sess: 
img_data = tf.image.decode_jpeg(img_raw_data) #对jpeg格式的图像进行解码,若是png格式,则使用tf.image.decode_png(未解码的数据),结果为张量
plt.imshow(resized.eval())
plt.show()
ecoded_image = tf.image.encode_png(img_data) #压缩编码
with tf.gfile.GFile("保存地址","wb") as f:
    f.write(ecoded_image.eval())  #写入文件

改变图片的大小(通过算法)

#使用tf.image.resize_images(图片张量,改变后大小,调整方法)
resized1 = tf.image.resize_images(img_data,size=[1000,1000],method=0)#双线性插值法
resized2 = tf.image.resize_images(img_data,size=[1000,1000],method=1)#最近邻居法
resized3 = tf.image.resize_images(img_data,size=[1000,1000],method=2)#双三次插值法
resized4 = tf.image.resize_images(img_data,size=[1000,1000],method=3)#面积插值法
print(resized1.get_shape())  #可以获取图片打下的信息

改变图片大小(通过剪裁)

#当所修改的尺寸大于原始图像尺寸时,使全零填充,当所修改的尺寸小于原始图像尺寸时,自动截取原始图像居中部分
croped = tf.image.resize_image_with_crop_or_pad(resized,500,500)
plt.imshow(croped.eval())
plt.show()
padded = tf.image.resize_image_with_crop_or_pad(resized,2000,2000)
plt.imshow(padded.eval())
plt.show()

尺寸小于:
在这里插入图片描述
尺寸大于:
在这里插入图片描述

图像翻转

img_data = tf.image.decode_jpeg(img_raw_data)  #解码
flipped = tf.image.flip_up_down(img_data)#上下翻转
flipped = tf.image.flip_left_right(img_data)#左右翻转
transped = tf.image.transpose_image(img_data)#对角线翻转
flipped = tf.image.random_flip_up_down(img_data)#左右随机翻转
flipped = tf.image.random_flip_left_right(img_data)#上下随机翻转

上下翻转
在这里插入图片描述
左右翻转
在这里插入图片描述
对角线:

在这里插入图片描述

图像色彩调整(亮度)

#调用tf.image.adjust_breghtness(图像矩阵,调整系数(大于负1小于1)
#小于-1后,就是全黑的图像,大于1则是全白图像
adjusted = tf.image.adjust_brightness(img_data,-0.3)
adjusted = tf.image.adjust_brightness(img_data,0.6)
#随机在[-max_delta,max_delta)范围随机调整图像的亮度,记住此处是random
adjusted = tf.image.random_brightness(img_data,max_delta)

-0.3图像
在这里插入图片描述
0.6图像
在这里插入图片描述

图像色彩调整(对比度)

#调用tf.image.adjust_contrast(图像矩阵,对比度)
adjust = tf.image.adjust_contrast(img_data,-5)
adjust = tf.image.adjust_contrast(img_data,5)
#在一个给定的范围内进行随机变换,[lower,upper],值得注意的是lower>=0;
adjust = tf.image.random_contrast(img_data,0,5)

-5的图像
在这里插入图片描述
5的图像
在这里插入图片描述

图像色彩调整(色相)

#函数tf.image.adjust_hue(图像矩阵,系数)
adjust = tf.image.adjust_hue(img_data,0.3)
#在[0,max_delat]范围内变化
adjust = tf.image.random_hue(img_data,max_delat)

图像色彩调整(饱和度)

adjusted = tf.image.adjust_saturation(img_data,-5)
adjusted = tf.image.adjust_saturation(img_data,5)
#同样,最小值大于等于零
adjusted = tf.image.random_saturation(img_data,0,5)

标准化图像

adjusted = tf.image.per_image_standardization(img_data) #均值为0,方差为1
adjusted = tf.clip_by_value(adjusted, 0.0, 1.0) #为了显示出图像,矩阵不应该有负数,故此处调整为01之间

在这里插入图片描述

2018-09-22 10:10:48 weixin_36105362 阅读数 3653

人工智能、机器学习、神经网络、深度学习、TensorFlow、图像处理必备书籍(附PDF百度盘下载链接)

在学习人工智能相关相关知识中往往不理解其中相关术语意义和知识原理的组成,下面书籍是阿拉灯神丁君在阅读了大量书籍后觉得很不错的一部分,特此分享出来,以供大家学习之便利。内容链接如有侵犯到您的权益,请联系删除。

学习资料持续更新,完整书籍链接请关注 公众号“AI人工智能客栈” 回复关键字 “人工智能书籍” 获取百度盘链接

在这里插入图片描述

1、机器学习 周志华.pdf

链接:https://pan.baidu.com/s/1P5Owh7YoZ6ncQz9dXanwCA 密码:wzst

2、推荐系统实践.pdf

3、《自然语言处理综论》.pdf

4、《计算机视觉:一种现代方法》.pdf

5、图解机器学习.pdf

6、《决策知识自动化》.pdf

7、《人工智能:一种现代的方法(第3版)》.pdf

8、Python数据分析与挖掘实战.pdf

9、机器学习导论.pdf

10、面向机器智能的TensorFlow实践 (智能系统与技术丛书)_.pdf

11、图像处理、分析与机器视觉(第三版).pdf

12、TensorFlow实战_黄文坚(完整).pdf

13、Tensorflow 实战Google深度学习框架.pdf

14、统计学习方法.pdf

作者李航,是国内机器学习领域的几个大家之一,曾在MSRA任高级研究员,现在华为诺亚方舟实验室。书中写了十个算法,每个算法的介绍都很干脆,直接上公式,是彻头彻尾的“干货书”。每章末尾的参考文献也方便了想深入理解算法的童鞋直接查到经典论文;本书可以与上面两本书互为辅助阅读。

15、数学之美.pdf

作者吴军大家都很熟悉。以极为通俗的语言讲述了数学在机器学习和自然语言处理等领域的应用。

16、区块链新经济概论.pdf

最近也是在学习入门阶段,也就一个感觉“一如侯门深似海,从此节操是路人”,看的我是头晕眼花,公式,概念,金星星眼前飘过~~~…((/- -)/

以上电子书也基本都是高清版,本人对电子书的质量要求也是比较高的,影印版太垃圾了,更是伤银镜。

人工智能领域涵盖的知识非常的广:算法、深度学习、机器学习、自然语言处理、数据结构、Tensorflow、Python 、数据挖掘、搜索开发、神经网络、视觉度量、图像识别、语音识别、推荐系统、系统算法、图像算法、数据分析、概率编程、计算机数学、数据仓库、建模等关键词,基本涵盖了现阶段人工智能细分领域的人才结构。

2019-03-09 20:45:20 qq_36969835 阅读数 424

入门基础必备:

  • C#类库的GDI+可以支持图像处理
    在这里插入图片描述

  • bitmap主要是处理图片的
    在这里插入图片描述
    在这里插入图片描述
    直接利用文件名创建一个对象
    在这里插入图片描述
    利用已有的对象来创建
    在这里插入图片描述
    或者在内存里创建 利用宽,高创建
    在这里插入图片描述
    FromFile的方式创建

  • 更一般的图像处理,可以用图像的像素处理:

在这里插入图片描述

  • 用GetPixel(x,y)得到目标像素点的颜色的方法,用这种方式比较慢。
    在这里插入图片描述
  • 更一般的方法在处理图像是用指针
    C#是支持指针的,但是一般我们不用,在处理图像的时候,直接涉及到内存,就可以使用指针。
    基本方法是:用到LockBits()就是锁住像素的二进制位。

在这里插入图片描述
这里得到了一个像素对象。
在这里插入图片描述
此对象的 Scan0的属性可以简单理解为第一个像素点的位置在内存中位置。
这里是强制转化为指针的意思。理解为内存里的像素怎么存的。
pBase是指针的基位置。也就是第0个位置。
在这里插入图片描述
y代表高度。x表示宽度。
stride也是bitmapData的属性表示图像的一行在内存里占的字节数。是已经计算好了的。
解释是怎么计算的:一般图像是24位(也就是红绿蓝三个字节的话),大体上一行的宽度相当于图像的宽度乘以三(因为一个点占三个字节),但是习惯于一行里占的字节数是四的倍数,如果宽度乘以三不是四的倍数,就会自动补齐。
x*sizeof(PixIDdata)每一个点占的像素数
用指针一下就可以找到这个点。

  • 比较这两种方法:普通的方法是指针方法所用时间的五倍

    • 用普通GetPiexl方法:
      在这里插入图片描述
    • 用指针的方式:把普通的bitmap包装成unsafeBitmap,用指针的方式得到像素点:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      得到指针
      在这里插入图片描述
      注意:
      PixIDdata的结构:就是红绿。一般来说红是高字节的,把它放在后面。
      图像处理,在C#主要是对像素的各种运算。
  • 图像处理:如图像滤镜
    在这里插入图片描述

2012-10-06 07:15:57 luoweifu 阅读数 6427

       大家都知道,人类所获取的信息中,大部分都来自视觉,人类用自己的双眼观察世界,发现世界。图像是对客观存在的物体、场景的一种相似性的生动描述。现在在计算机、网络及电子产品看到的图像都属于数字图像。在讲解图像处理之前需要必备一些关于图像处理的基本知识,下面就对一些常用的关于图像处理的基本知识进行讲解。

像素

        像素是基本原色素及其灰度的基本编码。我们看到的数字图片是有一个二维的像素矩阵组成。像素在计算机中通常用3个字节24位保存,如16-23 位表示红色(R)分量,8-15 位表示绿色(G)分量,0-7 位表示蓝色(B)分量;详细信息见下面“计算机颜色模型机RGB”中颜色的表示。

现实世界是三维的,但是我们从现实世界拍摄的图像是二维信息。一张图片可以定义为一个二维函数f(x,y)(x,y)是二维空间中的点坐标,f(x,y)是对应于该点的坐标值,即像素。


        当图片尺寸以像素为单位时,每一厘米等于28像素,比如15*15厘米长度的图片,等于420*420像素的长度。 

一个像素所能表达的不同颜色数取决于比特每像素(BPP)。如8bpp[2^8=256色, 灰度图像]16bpp[2^16=65536色,称为高彩色]24bpps[2^24=16777216色,称为真彩色]

分辨率

       图像总像素的多少,称为图像分辨率。由于图像通常用矩阵表示,所以分辨率常用,m*n表示,其中n表示行数(即一列包含的像素)m表示列数(即一行包含的像素)。如640*480,表示图像的长和宽分别为640480,总像素为640*480=307200(相机中所说的30万分辨率),800*600,表示图像的长和宽分别为800600,总像素为800*600=480000(相机中所说的50万分辨率)。

计算机颜色模型机RGB

       颜色模型,是将颜色表示成数字形式的模型,或者说是一种记录图像颜色的方式。有RGB模型、CMYK模型、HSL模型、Lab颜色模型等,其中最常用的是RGB模型。

RGB

       大家都知道,几乎世界上的所有颜色都可以用红(Red)、绿(Green)、蓝(Blue)三种颜色的不同比例组合形成,红绿蓝被称为三原色。

然而在计算机上他是怎样表示的呢?

在计算机中,RGB三种颜色分别被量化成0255256个等级。这样彩色图像就有256*256*256=16777216种彩色,这种图像被称为全彩色图像(full-color nimage)或真彩色图像(true-color image)。

在图像中每一个像素保存一个颜色值,而每种颜色有RGB三种颜色组合而成。所以颜色可以用R、G、B三种颜色的三维坐标表示,如下图:


       根据以上图像颜色的组成原理,可以把一个图像分解成RGG三种基颜色的灰度图像。如下图:

        

原图1                                                                            1_red

        

1_green                                                                            1_blue

算法代码实现(java):见下面附录1

特别说明:当一张图片各个像素的RGB三种颜色的分量都相同时就是一个无彩色灰度图像。如下图:


1_gray

算法代码实现(java):见下面附录2

附录


附录1:将图片分解成R、G、B三种灰度图片的算法

/**
	 * 将图片分解成R、G、B三种灰度图片
	 */
	public static void analyseRGB() {
		OutputStream output = null;
		try {
			// read image
			BufferedImage img = ImageIO.read(new File("F:\\image processing\\图1.jpg"));
			int imageType = img.getType();
			int w = img.getWidth();
			int h = img.getHeight();
			int startX = 0;
			int startY = 0;
			int offset = 0;
			int scansize = w;
			int dd = w-startX;
			int hh = h - startY;
			int x0 = w / 2;
			int y0 = h / 2;
			//System.out.println("dd:" + dd + "  hh:" + hh);
			// rgb的数组,保存像素,用一维数组表示二位图像像素数组
			int[] rgbArray = new int[offset + hh * scansize
					+ dd];
			//newArray 保存处理后的像素
			int[] newArray = new int[offset + hh * scansize
			     					+ dd];
			img.getRGB(startX, startY, w, h, rgbArray, offset, scansize);
			
			int rgb = rgbArray[offset + (y0 - startY) * scansize
					+ (x0 - startX)];
			Color c = new Color(rgb);
			//System.out.println("中间像素点的rgb:" + c);
			for(int i=0; i<h-startY; i++) {
				for(int j=0; j<w-startX; j++) {
					c = new Color(rgbArray[i*dd + j]);
					//newArray[i*dd + j] = new Color(c.getRed(), 0, 0).getRGB() ;	//红色灰度图像
					//newArray[i*dd + j] = new Color(0, c.getGreen(), 0).getRGB();	//绿色灰度图像
					newArray[i*dd + j] = new Color(0, 0, c.getBlue()).getRGB();	//蓝色灰度图像
				}
			}
			
			// create and save to bmp
			//File out = new File("F:\\image processing\\图1_red.jpg");
			//File out = new File("F:\\image processing\\图1_green.jpg");
			File out = new File("F:\\image processing\\图1_blue.jpg");
			if (!out.exists())
				out.createNewFile();
			output = new FileOutputStream(out);
			BufferedImage imgOut = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
			imgOut.setRGB(startX, startY, w, h, newArray, offset, scansize);
			ImageIO.write(imgOut, "jpg", output);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (output != null)
				try {
					output.close();
				} catch (IOException e) {
				}
		}
	}


附录2:将图片分解成黑白图片的算法

/**
	 * 将图片分解成黑白图片
	 */
	public static void grayImage() {
		OutputStream output = null;
		try {
			// read image
			BufferedImage img = ImageIO.read(new File("F:\\image processing\\baboom.jpg"));
			int imageType = img.getType();
			int w = img.getWidth();
			int h = img.getHeight();
			int startX = 0;
			int startY = 0;
			int offset = 0;
			int scansize = w;
			int dd = w-startX;
			int hh = h - startY;
			int x0 = w / 2;
			int y0 = h / 2;
			System.out.println("dd:" + dd + "  hh:" + hh);
			// rgb的数组,保存像素,用一维数组表示二位图像像素数组
			int[] rgbArray = new int[offset + hh * scansize
					+ dd];
			//newArray 保存处理后的像素
			int[] newArray = new int[offset + hh * scansize
			     					+ dd];
			img.getRGB(startX, startY, w, h, rgbArray, offset, scansize);
			
			int rgb = rgbArray[offset + (y0 - startY) * scansize
					+ (x0 - startX)];
			Color c = new Color(rgb);
			System.out.println("中间像素点的rgb:" +c+" "+c.getRGB());
			for(int i=0; i<h-startY; i++) {
				for(int j=0; j<w-startX; j++) {
					c = new Color(rgbArray[i*dd + j]);
					//彩色图像转换成无彩色的灰度图像Y=0.299*R + 0.578*G + 0.114*B
					int gray = (int)(0.299*c.getRed() + 0.578*c.getGreen() + 0.114*c.getBlue());
					newArray[i*dd + j] = new Color(gray, gray, gray).getRGB();	//蓝色灰度图像
				}
			}
			
			// create and save to bmp
			File out = new File("F:\\image processing\\baboom_gray.jpg");
			if (!out.exists())
				out.createNewFile();
			output = new FileOutputStream(out);
			BufferedImage imgOut = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
			imgOut.setRGB(startX, startY, w, h, newArray, offset, scansize);
			ImageIO.write(imgOut, "jpg", output);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (output != null)
				try {
					output.close();
				} catch (IOException e) {
				}
		}
	}


没有更多推荐了,返回首页