精华内容
下载资源
问答
  • [总结] 常见图像增强方法总结(附实现代码)

    千次阅读 多人点赞 2019-08-05 08:30:07
    本篇博文用于总结常见图像增强方式,其中包括传统方法以及深度学习方法,并附有相应的实现代码。

    1. 传统方法

    1. ImageEnhance Module (PIL 库) 介绍
      ImageEnhance Module 包含多个用于图像增强的类(称为 enhancer class),每个类都含有enhance方法:

      enhancer.enhance(factor) -> enhanced_image
      其中,该方法接收参数 factor,格式为 float,用于控制图像增强的程度(factor 为 1 时,该方法返回原始图像的拷贝;factor 小于 1 时,该方法令输入图像的对比度等属性值减小;factor 小于 1 时,该方法令输入图像的对比度等属性值增大);
           该方法返回经图像增强过的图像。
      

      以下是示例代码:

      from PIL import Image
      from PIL import ImageEnhance
       
      # 原始图像
      image = Image.open('test.jpg')
      image.show()
       
      #亮度增强
      image_brightened = ImageEnhance.Brightness(image).enhance(1.5)
      image_brightened.show()
       
      #色度增强
      image_colored = ImageEnhance.Color(image).enhance(1.5)
      image_colored.show()
       
      #对比度增强
      image_contrasted = ImageEnhance.Contrast(image).enhance(1.5)
      image_contrasted.show()
       
      #锐度增强
      image_sharped = ImageEnhance.Sharpness(image).enhance(1.5)
      image_sharped.show()
      
    2. 直方图均衡化(Histogram Equalization)

      直方图均衡化的基本思想是把原始图像的直方图通过映射,将其分布变换为均匀分布,这增加了像素灰度值的动态范围,从而可达到增强图像整体对比度的效果。
      优点: 思路简单,操作可逆,计算量不大,对大部分场景下的图像有用
      缺点: 可能导致图像细节丢失,噪声的对比度增大而有用信息的对比度减小

      以下是示例代码:

      import cv2
      import numpy as np
      
      # 读取原图像
      img = cv2.imread('test.jpg')
      
      # 转为灰度图,进行直方图均衡化
      gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
      enhanced_gray = cv2.equalizeHist(gray)
      
      cv2.imshow('Enhanced Gray Image',np.hstack([gray,enhanced_gray]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced Gray Image')
      cv2.imwrite('result1.png',np.hstack([gray,enhanced_gray]))
      
      # 直接对 RBG 图像进行直方图均衡化,对每个通道进行均衡化
      (B, G, R) = cv2.split(img)
      B = cv2.equalizeHist(B)
      G = cv2.equalizeHist(G)
      R = cv2.equalizeHist(R)
      
      enhanced_img = cv2.merge([B,G,R])
      cv2.imshow('Enhanced Color Image',np.hstack([img,enhanced_img]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced Color Image')
      cv2.imwrite('result2.png',np.hstack([img,enhanced_img]))
      
      # 将图像由 RBG 空间转为 YCrCb 空间,对Y通道进行均衡化
      YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
      (Y, Cr, Cb) = cv2.split(YCrCb)
      Y = cv2.equalizeHist(Y)
      
      enhanced_YCrCb = cv2.cvtColor(cv2.merge([Y, Cr, Cb]), cv2.COLOR_YCR_CB2BGR) 
      cv2.imshow('Enhanced YCrCb Image',np.hstack([img,enhanced_YCrCb]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced YCrCb Image')
      cv2.imwrite('result3.png',np.hstack([img,enhanced_YCrCb]))
      
      # 直接对 RBG 图像进行自适应局部直方图均衡化,对每个通道进行均衡化
      clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) # create a CLAHE object (Arguments are optional).
      (B, G, R) = cv2.split(img)
      R, G, B = clahe.apply(R), clahe.apply(G), clahe.apply(B)
      
      enhanced_img = cv2.merge([B,G,R])
      cv2.imshow('Enhanced Color Image',np.hstack([img,enhanced_img]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced Color Image')
      cv2.imwrite('result4.png',np.hstack([img,enhanced_img]))
      

      以下为代码运行结果:(左侧为原图,右侧为经过图像增强后的结果)

    3. 灰度世界算法(Gray World Algorithm)

      灰度世界算法以灰度世界假设为基础,该假设认为:对于一幅有着大量色彩变化的图像,三个分量的平均值趋于同一灰度值。从物理意义上讲,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。灰度世界算法将这一假设强制应用于待处理图像,可以从图像中消除环境光的影响,获得原始场景图像。

      一般有两种方法确定Gray值:
      (1) 使用固定值,对于8位的图像(0~255)通常取128作为灰度值 Gray
      (2) 计算增益系数,分别计算三通道的平均值 avgR,avgG,avgB,则:Gray=(avgR+avgG+avgB)/3
      接着,计算增益系数 kr=Gray/avgR , kg=Gray/avgG , kb=Gray/avgB。利用计算出的增益系数,重新计算每个像素值,构成新的图片

      优点: 思路简单,计算量小,
      缺点: 当图像场景颜色并不丰富时,尤其出现大块单色物体时,该算法常会失效。

      以下是示例代码:

      import cv2
      import numpy as np
      from PIL import Image
      
      # 读取原图像
      img = cv2.imread('test.jpg')
      
      # 取三通道的平均值作为灰度值
      avgB = np.average(img[:, :, 0])  
      avgG = np.average(img[:, :, 1])  
      avgR = np.average(img[:, :, 2])  
      
      avg = (avgB + avgG + avgR) / 3
      
      result = np.zeros(img.shape,dtype=np.uint8)
      result[:, :, 0] = np.minimum(img[:, :, 0] * (avg / avgB), 255)
      result[:, :, 1] = np.minimum(img[:, :, 1] * (avg / avgG), 255)
      result[:, :, 2] = np.minimum(img[:, :, 2] * (avg / avgR), 255)
      
      cv2.imshow('Enhanced Image',np.hstack([img,result]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced Image')
      cv2.imwrite('result1.png',np.hstack([img,result]))
      

      以下为代码运行示例:(左侧为原图,右侧为经过图像增强后的结果)

    4. 自动白平衡(Automatic White Balance,AWB)
      什么是白平衡:假设图像中 R, G, B 最高灰度值对应于图像中的白点,最低灰度值的对应于图像中最暗的点;其余像素点利用 (ax+b) 映射函数把彩色图像中 R, G, B 三个通道内的像素灰度值映射到[0.255]的范围内。(经典算法包括:灰度世界算法,完美反射算法)

      白平衡的本质是让白色的物体在任何颜色的光源下都显示为白色,这一点对人眼来说很容易办到,因为人眼有自适应的能力,只要光源的色彩不超出一定的限度,就可以自动还原白色。但相机就不同了,无论是图像传感器还是胶卷都会记录光源的颜色,白色的物体就会带上光源的颜色,白平衡所要做的就是把这个偏色去掉。

      import cv2
      import numpy as np
      from PIL import Image
      
      # 读取原图像
      img = cv2.imread('test.jpg')
      
      # 将图像由 RBG 空间转为 LAB 空间
      result = cv2.cvtColor(img,cv2.COLOR_BGR2LAB)
      avg_a = np.average(result[:, :, 1])
      avg_b = np.average(result[:, :, 2])
      
      for x in range(result.shape[0]):
          for y in range(result.shape[1]):
              l, a, b = result[x, y, :]
              l*=100/255.0
              result[x,y,1] = a - (avg_a-128)*(1/100.0)*1.1
              result[x,y,2] = a - (avg_b-128)*(1/100.0)*1.1
      result = cv2.cvtColor(result,cv2.COLOR_LAB2BGR)
      
      cv2.imshow('Enhanced Image',np.hstack([img,result]))
      cv2.waitKey(0)
      cv2.destroyWindow('Enhanced Image')
      cv2.imwrite('result1.png',np.hstack([img,result]))
      

      以下为代码运行结果:(左侧为原图,右侧为经过图像增强后的结果)

    5. 自动色彩均衡(Automatic Color Equalization,ACE)

      ACE算法源自retinex算法,可以调整图像的对比度,实现人眼色彩恒常性和亮度恒常性,该算法考虑了图像中颜色和亮度的空间位置关系,进行局部特性的自适应滤波,实现具有局部和非线性特征的图像亮度与色彩调整和对比度调整,同时满足灰色世界理论假设和白色斑点假设。
      ACE的增强效果普遍比retinex好。需要注意的是,ACE中当前像素是与整个图像的其他像素做差分比较,计算复杂度非常非常高,这也是限制它应用的最主要原因。所以,一般算法中,会通过指定采样数来代替与整副图像的像素点信息进行差分计算,减少运算量,提高效率。

      以下是示例代码:

      # 需在 Python 2 下运行
      import cv2 
      import math
      import numpy as np
      
      def stretchImage(data, s=0.005, bins = 2000):    #线性拉伸,去掉最大最小0.5%的像素值,然后线性拉伸至[0,1]
          ht = np.histogram(data, bins);
          d = np.cumsum(ht[0])/float(data.size)
          lmin = 0; lmax=bins-1
          while lmin<bins:
              if d[lmin]>=s:
                  break
              lmin+=1
          while lmax>=0:
              if d[lmax]<=1-s:
                  break
              lmax-=1
          return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1)
       
      g_para = {}
      def getPara(radius = 5):                        #根据半径计算权重参数矩阵
          global g_para
          m = g_para.get(radius, None)
          if m is not None:
              return m
          size = radius*2+1
          m = np.zeros((size, size))
          for h in range(-radius, radius+1):
              for w in range(-radius, radius+1):
                  if h==0 and w==0:
                      continue
                  m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2)
          m /= m.sum()
          g_para[radius] = m
          return m
       
      def zmIce(I, ratio=4, radius=300):                     #常规的ACE实现
          para = getPara(radius)
          height,width = I.shape
          zh,zw = [0]*radius + range(height) + [height-1]*radius, [0]*radius + range(width)  + [width -1]*radius
          Z = I[np.ix_(zh, zw)]
          res = np.zeros(I.shape)
          for h in range(radius*2+1):
              for w in range(radius*2+1):
                  if para[h][w] == 0:
                      continue
                  res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1))
          return res
       
      def zmIceFast(I, ratio, radius):                #单通道ACE快速增强实现
          height, width = I.shape[:2]
          if min(height, width) <=2:
              return np.zeros(I.shape)+0.5
          Rs = cv2.resize(I, ((width+1)/2, (height+1)/2))
          Rf = zmIceFast(Rs, ratio, radius)             #递归调用
          Rf = cv2.resize(Rf, (width, height))
          Rs = cv2.resize(Rs, (width, height))
       
          return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius)    
                  
      def zmIceColor(I, ratio=4, radius=3):               #rgb三通道分别增强,ratio是对比度增强因子,radius是卷积模板半径
          res = np.zeros(I.shape)
          for k in range(3):
              res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius))
          return res
       
      if __name__ == '__main__':  
          img = cv2.imread('test.jpg')
          result = zmIceColor(img/255.0)*255
          result = result.astype(np.uint8)
          cv2.imshow('Enhanced Image',np.hstack([img,result]))
          cv2.waitKey(0)
          cv2.destroyAllWindows()  
          cv2.imwrite('result.png', result)  
      

      以下为代码运行结果:(左侧为原图,右侧为经过图像增强后的结果)

      1. 待续

    2. 深度学习方法

    待补充。

    参考资料:

    展开全文
  • 常用数字图像分割方法

    千次阅读 2018-11-05 06:52:50
    图像分割是一种重要的图像处理技术。 人们在对图像的认知,理解和应用中,往往仅对其中的某些特定部分感兴趣,这些部分通常被称为目标或前景,它们一般对应图像中特定的,具有独特性质的区域。 这里所说的特定部分...

    图像分割是一种重要的图像处理技术。

    人们在对图像的认知,理解和应用中,往往仅对其中的某些特定部分感兴趣,这些部分通常被称为目标或前景,它们一般对应图像中特定的,具有独特性质的区域。

    这里所说的特定部分的独特性质可以是灰度值,目标的轮廓,图形的纹理,颜色等。

    在图像处理中有时候会需要对图像中的特定目标进行分析处理,这时候就需要首先将它们从图像中提取出来,在此基础上才能进一步对特定目标进行分析。

    图像分割是根据图像的应用需求或组成结构将图像划分成若干个互不相交的子区域的过程。

    这些子区域指的是某种意义下具有共同属性的像素的连通集合。

    例如图像中特定形状目标所占的连通区域、图像背景所占的连通区域等。

    在图像处理中,连通指的是集合中任意两点之间都存在完全属于该集合的连通路径。

    连通包含4连通和8连通两种情况,如下图所示。

    4连通是指从该区域内任一点出发,在不超过该区域的前提下,可以通过上、下、左、右4个方向移动的组合,从而到达该区域内的任意像素点;同理8连通是从区域内任意一点出发,在不超过该区域的前提下,通过8个方向,即上、下、左、右、左上、左下、右上、右下移动的组合,从而到达该区域内的任意像素点。

    四连通和八连通示意图

    根据上述连通基本概念,可以给出图像分割的一般定义,即图像分割是指将一幅离散数字图像信号f(m,n)进行分割,将f分割为若干连通的、非空的子区域f1,f2,…fn,并且要满足以下均一性准则。

    1) f1∪f2∪…∪fn =f .

    2) "i ,当i=1,2…n时,fi是连通的。

    3) "fi均一性准则都是满足的。

    4) 对于任意两个相连的fifj ,E(fifj)=f.

    上述条件(1)说明了分割得到的所有子区域的并集应该包含图像中所有像素,即图像分割不能漏掉任何像素;条件(2)说明了分割得到的子区域的连通性;条件(3)说明分割得到的子区域都有其本身的特性,即在各个子区域内像素性质是相似均一的;条件(4)指出任何两个子区域都不重叠,即同一个像素不会被分在两个不同的子区域中。

    根据以上图像分割的定义,人们已经研究出了上千种不同的图像分割方法,典型而传统的方法可以分为基于阈值的方法、基于边缘的方法和基于区域的分割方法等。

    灰度阈值法分割

    常用的阈值化分割方法是将图像的灰度分成不同的级别,然后设置灰度门限值,再基于这个门限值将图像分割为不同的区域。

    阈值化分割由于其直观性和易操作性成为最常见的图像分割方法之一。

    图像分割阈值化处理的公式如下:

    上式所反应的阈值化处理是一种阶梯函数,其变换曲线如下图所示。

    可以看见,它的功能是以一定方式指定一个门限值,如果图像中某个灰度值大于该门限值,则将其置为一,否则,置为零。

    由于基于灰度阈值的分割方法是一种“一刀切”的分割方式。

    阈值的合理选取就对图像处理的结果有相当大的影响,若阈值选取过大,则会出现提取了图像的多余部分的情况;若阈值过小,则又会出现丢失感兴趣部分的情况。

    对于合理的选取分割阈值目前已经有很多成熟的方法可以借鉴,如最小误差阈值法,最大方差阈值法,最佳阈值法,差别分析法等。

    边缘检测法分割

    物体的边缘是图像局部亮度变化最显著的部分。

    利用边缘检测来分割图像,其基本思想是先检测边缘点,再按照一定方法将边缘点连接成边缘线,从而分割图像区域。

    边缘检测技术是数字图像处理中的一项非常重要的技术。

    由于图像上边缘线邻域是图像中一个灰度级变化比较剧烈的地带,衡量这种变化最有效的两个特征就是变化率和变化方向。

    从数学上来讲就是梯度向量的幅值和方向。

    因此对于一幅图像f(x,y)来讲,求其梯度的局部最大值和方向即为边缘检测。

    已知f(x,y)q方向沿r的梯度定义如下:

    达到最大值的条件是,即

    得到,或者

    梯度最大值,一般称其为梯度模。

    梯度模算子具有各向同性和位移不变性,适用于边缘检测,而灰度变化的方向,

    即边界的方向则可由计算得到。

    在实际应用中,一般以微分算子的形式表示,以卷积函数来实现,常用的算子有Roberts 算子、Prewitt算子、 Sobel算子等。

    其外,还有利用拐点位置处的二阶导数为0来检测边缘线的方法,如Laplacian算子就是最为常用的二阶导数算子。

    Laplacian算子对灰度突变比一般的一阶导数算子更加敏感,它虽然可以检测出绝大部分的边缘,但也存在一些缺点,如边缘不够连续、容易丢失一些边缘、不能获得边缘方向信息、对噪声敏感等。

    在使用Laplacian算子之前需要对图像做平滑处理。

    还有一个重要的边缘检测算子Canny算子,从一定意义上讲,它对受白噪声影响的阶跃型边缘检测是最优的。

    Canny边缘检测的基本思想是:首先使用Gauss滤波器对图像进行平滑滤波,再求取一阶偏导,最后对求导后的图像进行非极大值抑制,得到最后的边缘图像。

    它是具有图像平滑功能的边缘检测算子。

    区域分割

    区域分割法利用同区域内像素灰度值的相似性,将相似的区域合并,不相似的区域分割开。

    该方法认为分割出来的同一区域的像素有着相同或相似的性质,最为常见的区域分割方法有区域生长法和分裂合并法。

    区域生长法的基本思想是将具有相似性质的像素集合起来生长成为特定区域。

    其具体步骤是:首先在每个需要分割的区域内找到一个像素点作为该区域的种子点;然后按照一定的连通规则将种子点周围与其有相似性质的像素,按照一定准则合并到种子点的区域中;最后将这些新像素当作新的种子点继续以上步骤。

    区域生长法要首先解决的三个问题是:

    1)选择一组正确代表所需区域数目的种子点;

    2)确定生长准则;

    3)确定生长过程停止的条件。

    根据所需邻域和生长准则的不同,区域生长法可分为简单生长法、质心生长法、混合生长法等。

    分裂合并法是在事先完全不了解区域形状和区域数目时可采用的方法。

    这种方法先将图像分解成互不重叠、任意大小的区域,再按相似准则进行合并。

    这种分裂合并方法有一个方便的表示方法—四叉树,即将整个图像表示成一棵树,树中的每个节点都有四个后代,树可以一层一层被细分开来。

    如下图所示,设R0代表整个图像区域,从最高层开始,按照一定的相似性准则,将图像一层一层分裂,直到不能分为止。

    仅仅使用分裂是不够的,最后很有可能出现相邻的两个区域属于同一个目标的情况。

    为解决这一问题,在分裂后需要对图像进一步合并。

    合并过程只是合并相邻的区域,且经过合并组成的新区域需要满足一定的一致性测度准则。

    图像区域及四叉树

    可以将分裂合并算法总结为如下的步骤:

    1)给定一定相似性准则P,若对图像中的任一区域Ri,有P(Ri)=false,即不满足相似性准则,则将Ri 区域等分为四份子区域Ri1,Ri2,Ri3,Ri4 。

    2)对于相邻的区域Ri,Rj 若P(Ri ∪Ri)=true,则合并这两个区域。

    3)继续以上步骤直到分裂合并都不能进行时。

    最大类间方差阈值分割

    最大类间方差算法也叫大津算法,是1980年有日本学者大津提出的。

    最大类间方差法的原理是按照灰度特性将待分割图像分为背景和目标两部分,将背景和目标看作是两类,这两类间的方差越大,则说明其差别就越大,也就是说将目标类错分为背景或是将背景类错分为目标的概率就越小,因此使类间方差达到最大的分割就意味着此时的分割效果最好,错分概率最小。

    设一幅图像的灰度值为1~m级,灰度值i的像素数为ni,这时可以得到:

    像素总数为:

    各个灰度值的概率为:

    再用阈值T将其分为两组C0={1~T}和C1={T+1~m},各组产生的概率由下式给出。

    C0 产生的概率为:

    C1 产生的概率为:

    C0 的平均值为:

    C1的平均值为:

    其中,是整个图像的灰度平均值;指灰度为T的灰度均值,

    因此全部采样的灰度均值为:

    下式给出两组之间的方差:

    实际运用时,我们在1~m范围内改变T,求方差为最大时的T值,此时确定的T* 便是最大类间方差算法的阈值。

    此方法被公认为是阈值自动选择的最优方法。

    展开全文
  • 深度图像获取方法

    万次阅读 2017-07-31 22:20:57
    今天介绍一下深度图像获取方法主要有哪些,以及这些方法会导致深度图像中存在什么样的问题。 在计算机视觉系统中,三维场景信息为图像分割、目标检测、物体跟踪等各类计算机视觉应用提供了更多的可能性,而...

    原文链接:http://blog.csdn.net/nature_XD/article/details/69365812


    今天介绍一下深度图像的获取方法主要有哪些,以及这些方法会导致深度图像中存在什么样的问题。

    在计算机视觉系统中,三维场景信息为图像分割、目标检测、物体跟踪等各类计算机视觉应用提供了更多的可能性,而深度图像(Depth map)作为一种普遍的三维场景信息表达方式得到了广泛的应用。深度图像的每个像素点的灰度值可用于表征场景中某一点距离摄像机的远近。
    获取深度图像的方法可以分为两类:被动测距传感和主动深度传感。
    In short:深度图像的像素值反映场景中物体到相机的距离,获取深度图像的方法=被动测距传感+主动深度传感。

    被动测距传感

    被动测距传感中最常用的方法是双目立体视觉[1,2],该方法通过两个相隔一定距离的摄像机同时获取同一场景的两幅图像,通过立体匹配算法找到两幅图像中对应的像素点,随后根据三角原理计算出时差信息,而视差信息通过转换可用于表征场景中物体的深度信息。基于立体匹配算法,还可通过拍摄同一场景下不同角度的一组图像来获得该场景的深度图像。除此之外,场景深度信息还可以通过对图像的光度特征[3]、明暗特征[4]等特征进行分析间接估算得到。
    这里写图片描述

    上图展示了Middlebury Stereo Dataset中Tsukuba场景的彩色图像、视差实际值与用Graph cuts算法得到的立体匹配误差估计结果,该视差图像可以用于表征场景中物体的三维信息。
    可以看到,通过立体匹配算法得到的视差图虽然可以得到场景的大致三维信息,但是部分像素点的时差存在较大误差。双目立体视觉获得视差图像的方法受限于基线长度以及左右图像间像素点的匹配精确度,其所获得的视差图像的范围与精度存在一定的限制。

    In short, 常用于深度图像增强领域的测试数据集Middlebury Stereo Dataset属于被动测距传感;被动测距传感=两个相隔一定距离的相机获得两幅图像+立体匹配+三角原理计算视差(disparity)

    主动测距传感

    主动测距传感相比较于被动测距传感最明显的特征是:设备本身需要发射能量来完成深度信息的采集。这也就保证了深度图像的获取独立于彩色图像的获取。近年来,主动深度传感在市面上的应用愈加丰富。主动深度传感的方法主要包括了TOF(Time of Flight)、结构光、激光扫描等。

    TOF相机

    TOF相机获取深度图像的原理是:通过对目标场景发射连续的近红外脉冲,然后用传感器接收由物体反射回的光脉冲。通过比较发射光脉冲与经过物体反射的光脉冲的相位差,可以推算得到光脉冲之间的传输延迟进而得到物体相对于发射器的距离,最终得到一幅深度图像。
    TOF相机所获得的深度图像有以下的缺陷:
    1. 深度图像的分辨率远不及彩色图像的分辨率
    2. 深度图像的深度值受到显著的噪声干扰
    3. 深度图像在物体的边缘处的深度值易出现误差,而这通常是由于一个像素点所对应的场景涵盖了不同的物体表面所引起的。
    除此之外,TOF相机的通常价格不菲。
    这里写图片描述

    结构光与Kinect

    结构光是具有特定模式的光,其具有例如点、线、面等模式图案。

    基于结构光的深度图像获取原理是:将结构光投射至场景,并由图像传感器捕获相应的带有结构光的图案。

    由于结构光的模式图案会因为物体的形状发生变形,因此通过模式图像在捕捉得到的图像中的位置以及形变程度利用三角原理计算即可得到场景中各点的深度信息。

    结构光测量技术提供了高精度并且快速的三维信息,其在汽车、游戏、医疗等领域均已经得到了广泛的应用。

    基于结构光的思想,微软公司推出了一款低价优质的结合彩色图像与深度图像的体感设备Kinect,该设备被应用于如人机交互(Xbox系列游戏机)、三维场景重建、机器视觉等诸多领域。
    这里写图片描述
    微软公司的Kinect有三个镜头,除了获取RGB彩色图像的摄像机之外,左右两边的镜头分别是红外线发射器和红外线CMOS摄像机,这两个镜头共同构成了Kinect的深度传感装置,其投影和接收区域相互重叠,如下图所示。
    这里写图片描述

    Kinect采用了一种名为光编码(Light Coding)的技术,不同于传统的结构光方法投射一幅二维模式图案的方法,Kinect的光编码的红外线发射机发射的是一个具有三维纵深的“立体编码”。光编码的光源被称为激光散斑,其形成原理是激光照射到粗糙物体或穿透毛玻璃后得到了随机的衍射斑点。激光散斑具有高度的三维空间随机性。当完成一次光源标定后,整个空间的散斑图案都被记录,因此,当物体放进该空间后,只需得知物体表面的散斑图案,就可以知道该物体所处的位置,进而获取该场景的深度图像。红外摄像机捕获的红外散斑图像如下图所示,其中左侧的图片展现了右侧图片中框中的细节。
    这里写图片描述

    Kinect低廉的价格与实时高分辨率的深度图像捕捉特性使得其在消费电子领域得到了迅猛发展,然而Kinect的有效测距范围仅为800毫米到4000毫米,对处在测距范围之外的物体,Kinect并不能保证准确深度值的获取。Kinect捕获的深度图像存在深度缺失的区域,其体现为深度值为零,该区域意味着Kinect无法获得该区域的深度值。而除此之外,其深度图像还存在着深度图像边缘与彩色图像边缘不对应、深度噪声等问题。Kinect所捕获的彩色图像与深度图像如下图所示。
    这里写图片描述

    Kinect所捕获的深度图像产生深度缺失区域的原因多种多样。除了受限于测距范围,一个重要的原因是目标空间中的一个物体遮挡了其背后区域。这种情况导致了红外发射器所投射的图案无法照射到背后区域上,而背后区域却有可能被处在另一个视角的红外摄像机捕捉到,然而该区域并不存在散斑图案,该区域的深度信息也就无法被获得。【Oops,原来遮挡是这样导致了深度值缺失,作者果然厉害,两句话让人茅塞顿开!】物体表面的材质同样会影响Kinect深度图像的获取。当材质为光滑的平面时,红外投射散斑光束在物体表面产生镜面反射,红外摄像机无法捕捉该物体反射的红外光,因此也就无法捕获到该表面的深度;当材质为吸光材料时,红外投射散斑被该表面所吸收而不存在反射光,红外摄像机同样无法捕捉到该表面的深度信息。【材质对深度缺失的影响,分析到位】除此之外,Kinect所捕获的深度图像存在的与彩色图像边缘不一致的问题主要是由彩色摄像机与红外摄像机的光学畸变引起的。

    激光雷达

    激光雷达测距技术通过激光扫描的方式得到场景的三维信息。其基本原理是按照一定时间间隔向空间发射激光,并记录各个扫描点的信号从激光雷达到被测场景中的物体,随后又经过物体反射回到激光雷达的相隔时间,据此推算出物体表面与激光雷达之间的距离。
    激光雷达由于其测距范围广、测量精度高的特性被广泛地用于室外三维空间感知的人工智能系统中,例如自主车的避障导航、三维场景重建等应用中。下图展示的是激光雷达Velodyne HDL-64E在自主车中的应用,该激光雷达能够获取360°水平方向上的全景三维信息,其每秒能够输出超过130万个扫描点的数据。全向激光雷达曾在美国举办的DARPA挑战赛中被许多队伍所采用,其也成为了自主行驶车辆的标准配置。
    这里写图片描述

    然而,激光雷达所捕获的三维信息体现在彩色图像坐标系下是不均匀并且稀疏的。由于单位周期内,激光扫描的点数是有限的,当把激光雷达捕获的三维点投射到彩色图像坐标系下得到深度图像时,其深度图像的深度值以离散的点的形式呈现,深度图像中许多区域的深度值是未知的。这也就意味着彩色图像中的某些像素点并没有对应的深度信息。

    总结
    用一个图来总结下内容吧。

    这里写图片描述

    参考论文:
    浙大2014年刘俊毅的硕士论文《彩色图像引导的深度图像增强》
    Middlebury数据集: http://vision.middlebury.edu/stereo/




    展开全文
  • 常用Matlab图像加噪方法

    千次阅读 2017-02-08 21:42:18
    高斯模糊图像 使用fspecial和imfilter(不同标准差:0.25、0.5、1等) 高斯白噪声 零均值、不同标准差(0.0003、0.001、0.003、0.01、0.03等),使用imnoise jpeg和jpeg2000 获得不同质量级的压缩图片,使用...
    1. 高斯模糊图像
      使用fspecial和imfilter(不同标准差:0.25、0.5、1等)
    2. 高斯白噪声
      零均值、不同标准差(0.0003、0.001、0.003、0.01、0.03等),使用imnoise
    3. jpeg和jpeg2000
      获得不同质量级的压缩图片,使用imwrite
    I=imread('lena.png');
    imwrite(I,‘I_Jpeg.jpg’,'quality',80);
    展开全文
  • 常见图像插值方法比较(opencv)

    万次阅读 2017-10-13 17:01:35
    图像插值方法比较本文介绍几种经典插值的原理,代码过程以及对性能作出比较。简单说来,在对原始图像进行缩放、旋转变换的时候,因为在目标图像中像素分布发生了变换,所以需根据一定的映射规则建立从原始图像到目标...
  • 像素级图像融合常用方法

    万次阅读 多人点赞 2019-07-18 11:22:42
    像素级图像融合常用方法: 根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征提取并直接使用。也正是得益于其对...
  • 常用传统图像处理方法梳理

    千次阅读 2020-04-19 00:35:36
    图像滤波(1) 图像滤波(2) 图像增强——常见边缘检测算子2. HoG特征与SIFT特征(1) HoG(2) SIFT 特征3. 霍夫变换(1) 直线检测(2) 霍夫变换圆检测4. 开闭运算 腐蚀膨胀5. 插值 0. 颜色空间 常见颜色空间: RGB HSI...
  • 图像处理常见方法

    千次阅读 2015-06-28 09:52:38
    一、图像去噪方法 1.噪声类型 常见的有加性噪声和乘性噪声,加性噪声包括高斯噪声,椒盐噪声等。图像中的噪声往往和信号交织在一起,特别是乘性噪声,如果平滑不当,很容易是图像本身的细节,如边缘轮廓、线条等变...
  • 图像融合方法

    2020-11-11 21:16:11
    一、基于神经网络的图像融合方法 ...作者尝试在编码过程中从源图像获取更多有用的feature,并设计了两个融合层(融合策略)以融合feature。 最后,通过解码器重建融合图像。编码器包含两个部分(C1和DenseBlock),
  • 图像增强方法

    万次阅读 多人点赞 2019-03-26 14:54:49
    一般的图像增强方法根据增强处理过程所在的空间不同,可分为基于空域和频域的方法。基于空域的方法直接对图像进行处理,包括对比度增强和图像平滑;基于频域的方法是在图像的某种变换域内对图像的变换系数进行修正,...
  • 医学图像常用特征提取方法

    千次阅读 2016-07-22 16:22:41
    一般常用图像特征类型有图像的灰度特征,如图像总体或局部的均值、方差;图像的纹理特征,如共生矩阵、等灰度行程长度、傅立叶频谱、随机场模型等;图像的频谱特征;图像灰度变换的梯度特征;图像物体形状特征,如...
  • 今天景联文科技给大家介绍10种常见图像数据标注方法及其应用。 http://www.jinglianwen.com/admin/rest/newsinfo?id=51 1、语义分割 语义分割是指根据物体的属性,对复杂不规则图片进行进行区域划分,并标注...
  • 前言:Mat是OpenCV的最基本的类型,他有很多常见的属性和方法,可以获取这张图片的基本信息,帮助我们更好地理解图片,本文做了一个简单的小结,并说明了一些常见的易错点。 一、Mat对象常见的属性以及方法一览 ...
  • 常用图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 一 颜色特征 (一)特点:颜色特征是一种全局特征,描述了图像图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有...
  • 常见图像和视频分割方法概述 图像与视频分割是指按照一定的原则将图像或视频序列分为若干个特定的、具有独特性质的部分或子集,并提取出感兴趣的目标,便于更高层次的分析和理解,因此图像与视频分割是目标特征...
  • 图像分割:阈值获取方法总结

    万次阅读 2017-07-16 16:18:29
    阈值分割原理: 一副图像包括目标、背景和噪声,设定某一阈值T将图像分成两部分:大于T的像素群和小于T的像素群。 在实际处理时候,为了显示...图像阈值化分割是一种传统的最常用图像分割方法,因其实现简单、
  • 图像分割方法

    千次阅读 2013-11-12 09:31:01
    基于区域的方法采用某种准则,直接将图像划分为多个区域,基于边缘的方法则通过检测包含不同区域的边缘,获得关于各区域的边界轮廓描述,达到图像分割的目的,而区域与边缘相结合的方法通过区域分割与边缘检测的相互...
  • Qt 中获取摄像头图像数据的方法

    万次阅读 2017-06-17 20:34:11
    Qt 中获取摄像头图像数据的方法在 Qt 中提供了 QCamera 类用来操作摄像头。(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机。)摄像头获取的实时图像可以显示在 ...
  • 图像采样方法

    千次阅读 2018-06-27 21:39:56
       这种插值方法根据源图像和目标图像之间的相对位置来将目标图像上像素确定为相对源图像上相对位置的像素值,对于任意一幅源图像来说,假设放大后目标图像的宽为Dw高为Dh,任意目标像素点(Dx, Dy)在源图像上的位置...
  • 图像分割方法总结
  • python 图像分割方法总结

    千次阅读 2020-07-01 23:17:21
    图像分割是一种常用图像处理方法,可分为传统方法和深度学习的方法。深度学习的方法比如:mask rcnn这类实例分割模型,效果比传统的图像分割方法要好的多,所以目前图像分割领域都是用深度学习来做的。但是深度...
  • C#中的bitmap类和图像像素值获取方法

    千次阅读 2017-11-08 11:08:29
    C#中的bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和...
  • 数字图像处理常用方法总结

    万次阅读 2018-06-03 11:29:45
    做了几年的图像处理,可以对一些使用的方法进行总结: 1、图像变换 由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,例如: 傅立叶变换、沃尔什变换、离散余弦...
  • 遥感图像增强方法应用

    千次阅读 2018-11-11 05:12:15
    遥感图像增强方法应用
  • layout: post # 使用的布局(不需要改)...title: 数字图像处理的常用方法 date: 2019-03-25 16:59:56 type: categories author: Liu Fan tags: Image processing categories: Computer vision mathjax: true catal...
  • 数字图像处理的基本原理和常用方法  数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。图像处理最早出现于 20 世纪 50 年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来...
  • 常见的噪声模型有(z是噪声值,μ表示均值,s2表示方差): 1、高斯噪声 2、瑞里噪声μ=a+sqrt(pi*b/4),s2=b(4-pi)/4 3、伽马噪声 μ=b/a,s2=b/a^2 4、指数分布噪声 μ=1/a,s2=1/a^2 5、均匀分布噪声 μ=(a+b)/2,s2=(b...
  • 构建了图像增强系统平台,主要探讨了在图像增强基础上,...BIOS测试中的测试用例大多是在未安装操作系统的环境下进行的,常用的在Windows和DOS环境下的抓图方法[1]并不适用在文中系统中,因此开发并设计出图像增强模块。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,672
精华内容 77,468
关键字:

常用的图像获取方法