图像处理背景分离

2019-03-02 19:26:30 exsouit 阅读数 1051

c++&opencv

很多分离函数使用的参数类型为iplimage形的,在使用cvcreatimage函数时生成的图片为bgr格式,电脑读取时会产生不正常的绿化。所以不如直接用mat类读进来直接进行分离

#include <iostream>

#include <opencv2\highgui\highgui.hpp>

#include <opencv2\core\core.hpp>

#include <opencv2\imgproc\imgproc.hpp>



using namespace std;

using namespace cv;



int main()

{

	Mat imag1;//被减图象
	Mat imag2;//减图像
	Mat result;

	imag1 = imread("ca.bmp", 1);	//将读入的彩色图像直接以灰度图像读入
	imag2 = imread("cb.bmp", 1);
	namedWindow("1", WINDOW_NORMAL);
    imshow("1", imag1);
	namedWindow("2", WINDOW_NORMAL);
	imshow("2", imag2);

    absdiff(imag1, imag2, result);	
	namedWindow("r", WINDOW_NORMAL);

	imshow("r", result);
	imwrite("cc.jpg", result);

	waitKey();

	return 0;

}

 

2017-12-22 15:17:11 qq_25248517 阅读数 801

一、图像的分类

1.二值图像
二值图像(Binary Image)是指将图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。
二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素不是0就是1,再无其他过渡的灰度值。
二值图像是指:每个像素不是黑就是白,其灰度值没有中间过渡的图像。二值图像一般用来描述文字或者图形,其优点是占用空间少,缺点是,当表示人物,风景的图像时,二值图像只能描述其轮廓,不能描述细节。这时候要用更高的灰度级。
二值图像是每个像素只有两个可能值的数字图像。人们经常用黑白B&W、单色图像表示二值图像,但是也可以用来表示每个像素只有一个采样值的任何图像,例如灰度图像等。
2.灰度图像
灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
一幅完整的图像,是由红色、绿色、蓝色三个通道组成的。红色、绿色、蓝色三个通道的缩览图都是以灰度显示的。用不同的灰度色阶来表示“ 红,绿,蓝”在图像中的比重。通道中的纯白,代表了该色光在此处为最高亮度,亮度级别是255。
通道是整个Photoshop显示图像的基础。色彩的变动,实际上就是间接在对通道灰度图进行调整。通道是Photoshop处理图像的核心部分,所有的色彩调整工具都是围绕在这个核心周围使用的。
在计算机领域中,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。
3.假彩色图像
假彩色增强所处理的图像通常是一幅自然彩色图像或同一景多光谱图像。利用假彩色合成的图像称为假彩色图像,它是彩色增强图像的一种。利用假彩色图像可以突出相关专题信息,提高图像视觉效果,从图像中提取更有用的定量化信息。通过假彩色处理的图像,可以获得人眼所分辨不出、无法准确获得的信息,便于地物识别,提取更加有用的专题信息。
人眼只能区分20余种不同等级的灰度,却可辨别几千种不同的色度与不同亮度。真彩色图像是指符合人眼视觉习惯的颜色,即影像与实际地貌相一致。由于在进行图像分析时,肉眼难以鉴别色彩相近的各个波段,因此,将真彩色图像转变为与实际地貌不一致的色彩,可以提高图像的可鉴别度。假彩色图像就是图像的彩色显示中的一种,也是在进行遥感影像监督分类等过程时常常运用的图像。
假彩色图像是通过不同波段合成得到的彩色影像,目的主要有两个:一个是使感兴趣的目标呈现奇异的彩色或置于奇特的色彩环境中,从而更受人注目;一个是为了使景物呈现出与人眼色相匹配的颜色,以突出相关的专题信息,提高图像的视觉效果,使分析者能够更容易地识别图像内容,从图像中提取更有用的定量化信息。例如,人眼视网膜中锥状细胞对绿色最敏感,因此,若把原来颜色不易辨认的目标经假彩色处理呈现绿色,就能大大提高人眼对目标的分辨力。
彩色合成图像显示,即三幅8bit图像以R、G、B方式存于存储器内,通过三个8bit分离的数模变换器(DAC)连续读每个R、G、B图像的同一像元亮度值,并变换为模拟信号。假彩色图像则是彩色图像增强的一种。
若红波段(R)、绿波段(G)、蓝波段(B)三幅图像分别赋予R、G、B三色,所生成的是“真彩色”或“天然”彩色合成图像,如TM3、2、1(RGB);若三幅其他任何波段图像赋予R、G、B三色,则得假彩色合成图像,如TM1、2、3(RGB),TM3、5、4(RGB)等;若近红外波段(NIR)、红波段(R)、绿波段(G)三幅图像分别赋予R、G、B三色,则得标准假彩色合成图像,如TM4、3、2(RGB),SPOT3、2、1(RGB)等;在标准假彩色合成图像中,三种主要的地表覆盖类型:植被呈红色系列,水体呈蓝色系列,裸地呈浅色系列,易于识别[2]  。
4.多通道彩色图像
个人理解,多通道的例如rgb图,每个像素点都有3个值表示 ,所以就是3通道。也有4通道的图。单通道的图像,每个像素点只有1个值表示颜色,即灰度图。(也有3通道的灰度图,3通道灰度图只有一个通道有值,其他两个通道的值都是零)。
5.多光谱图像
多光谱图像是由多个波段对同一目标进行反复拍摄而得道的图像,由于目标中的各各物体对同一波段的敏感性不一样,因此多光谱图像中的每幅图像之间也有一定的不同之处。 
6.三维图像
立体图视觉上层次分明色彩鲜艳,具有很强的视觉冲击力,让观看的人驻景时间长,留下深刻的印象。立体图给人以真实、栩栩如生,人物呼之欲出,有身临其境的感觉,有很高的艺术欣赏价值。利用立体图像包装企业,使企业形象更加鲜明,突出企业实力和档次,增加影响力!更能突出产品的高品质和高档次。也可以做出色彩艳丽、层次分明的立体婚纱、照片,是当前影像业最新的卖点之一。
7.视频
视频Video)泛指将一系列静态影像电信号方式加以捕捉纪录处理储存传送与重现的各种技术。连续的图像变化每秒超过24(frame)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片






2015-05-31 20:13:46 lights_joy 阅读数 4311

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息


下面尝试分离图片中的土壤与植物,目标是取得绿色植物图像,将土壤背景变为黑色。测试图像:


首先使用2g-r-b得到一个灰度图及其直方图:


# -*- coding: utf-8 -*- 
import cv2
import numpy as np
import matplotlib.pyplot as plt


# 使用2g-r-b分离土壤与背景

src = cv2.imread('f:\\tmp\\cotton.jpg')
cv2.imshow('src', src)

# 转换为浮点数进行计算
fsrc = np.array(src, dtype=np.float32) / 255.0
(b,g,r) = cv2.split(fsrc)
gray = 2 * g - b - r

# 求取最大值和最小值
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray)

# 计算直方图
hist = cv2.calcHist([gray], [0], None, [256], [minVal, maxVal])
plt.plot(hist)
plt.show()

cv2.waitKey()

原来在计算直方图之前都先把它转换为u8的类型,现在看起来完全是多余的!只需要给出级数和最大最小值就可以了!


最后得到了2g-r-b的直方图:



再用OTSU2g-r-b的灰度图进行二值化:


# 转换为u8类型,进行otsu二值化
gray_u8 = np.array((gray - minVal) / (maxVal - minVal) * 255, dtype=np.uint8)
(thresh, bin_img) = cv2.threshold(gray_u8, -1.0, 255, cv2.THRESH_OTSU)
cv2.imshow('bin_img', bin_img)

然后就得到了一个很好的二值图像:



以此为掩码得到彩色的植株图像:


# 得到彩色的图像
(b8, g8, r8) = cv2.split(src)
color_img = cv2.merge([b8 & bin_img, g8 & bin_img, r8 & bin_img])

看看结果:



基本符合我们的预期。








2016-01-27 19:58:23 u010402786 阅读数 37878

前提

    运动目标的检测是计算机图像处理与图像理解领域里一个重要课题,在机器人导航、智能监控、医学图像分析、视频图像编码及传输等领域有着广泛的应用。
                                      这里写图片描述

目标检测方法分类

  第一,已知目标的先验知识。在这种情况下检测目标有两类方法,第一类方法是用目标的先验知识训练一堆弱分类器,然后这些弱分类器一起投票来检测目标,如boosting, random forest 都是这个思路,大家熟知的adaboost人脸检测也是如此。第二类方法是根据先验知识找到目标和非目标的最佳划分线,如SVM.这两类方法各成一家,各有所长,都有着不错的表现。

  第二,未知目标的先验知识。此时不知道要检测的目标是什么,于是什么是目标就有了不同的定义。一种方法是检测场景中的显著目标,如通过一些特征表达出场景中每个像素的显著性概率,然后找到显著目标。另一种方法就是检测场景当中的运动目标了。

经典目标检测方法

1、背景差分法
  在检测运动目标时,如果背景是静止的,利用当前图像与预存的背景图像作差分,再利用阈值来检测运动区域的一种动态目标识别技术。
  背景差分算法适用于背景已知的情况,但难点是如何自动获得长久的静态背景模型。
  matlab中单纯的背景差分直接是函数imabsdiff(X,Y)就可以。
2、帧差分法
  利用视频序列中连续的两帧或几帧图像的差来进行目标检测和提取。在运动的检测过程中,该方法利用时间信息,通过比较图像中若干连续帧获得对应像素点的灰度差值,如果均大于一定的阈值T2,则可以判断该位置存在运动的目标。
  较适合于动态变化场景。
3、光流场法
  利用相邻两帧中对应像素的灰度保持原理来评估二维图像的变化。能够较好的从背景中检测到相关前景目标,甚至是运动屋里中的部分运动目标,适用于摄像机运动过程中相对运动目标的检测。
  开口问题、光流场约束方程的解的不唯一性问题。不能正确的表示实际的运动场。
        例子如下:
       1.首先在一帧图像内随机均匀选取k个点,并滤除那些邻域纹理太光滑的点,因为这些点不利于计算光流。
这里写图片描述
       2.计算这些点与上一帧图像的光流矢量,如上右图,此时已经可以看出背景运动的大概方向了。
       这里写图片描述
       3.接下来的这一步方法因人而异了。
       2007年cvpr的一篇文章Detection and segmentation of moving objects in highly dynamic scenes的方法是把这些光流点的(x,y,dx,dy,Y,U,V)7个特征通过meanshift聚类来聚合到一起,最后形成运动目标轮廓。

新目标检测方法

       其实写到这里想了想到底能不能叫目标检测,博主认为图像的前背景分离也是目标检测的一种(博主才疏学浅,求赐教)

1、像素点操作
  对每个像素点进行操作,判别为前景或者背景两类。如下面的图片所示:
  这里写图片描述
2、低秩矩阵应用
  背景建模是从拍摄的视频中分离出背景和前景。下面的例子就是将背景与前景分离开。使用的方法是RPCA的方法。
  其网址以及效果如下:
  http://perception.csl.illinois.edu/matrix-rank/introduction.html
  这里写图片描述
3、深度学习
  FCN + denseCRF 精确分割+语义标签。图像中的前景目标检测分割做的很好,下面还能做出语义检测,判断出图中的东西属于什么。This demo is based on our ICCV 2015 paper :Conditional Random Fields as Recurrent Neural Networks,
  测试网址以及测试图像如下:
  http://www.robots.ox.ac.uk/~szheng/crfasrnndemo
  这里写图片描述


推荐另外一篇关于神经网络改进方法的上篇内容:
http://blog.csdn.net/u010402786/article/details/49272757
       另外附上一个深度学习未来发展趋势之一:
       “注意力模型” 在未来的发展,注意力模型的升温。一些系统,但不是全部,开始放到“注意力模型”的背景中,或者说让神经网络在完成任务的过程中试图学习在哪里放置其“注意力”。这些还不是一个正规神经网络流水线中的一部分,但是已经时不时的出现在模型中了。

2018-06-12 20:29:09 program_developer 阅读数 2187

“微信公众号”


本文介绍图像处理、计算机视觉、图像前背景分离技术等领域的术语。这里给出若干相关术语及本文对这些术语的解释。

1. 前背景分离(matting):也称抠图,即将图像或视频的某一感兴趣的部分从原始图像或视频中分离出来,主要功能是为了和另一个图像或视频进行合成,形成新的图像或视频。

2. 颜色空间(color space):颜色模型是使用一组值(通常三个、四个值或者颜色成分)表示颜色的抽象数学模型,比如RGB和CMYK都是颜色模型。在颜色模型和一个特定的参照颜色空间之间加入一个特定的映射函数就在参照颜色空间中确定了一个明确的色域,并且与颜色模型一起定义为一个新的颜色空间。

3. 前景蒙版(alpha matte):也称前景透明度或透明度蒙版,是前背景分离的结果,是一个灰度图,每一个像素点的灰度值表示原始图像每个像素属于前景物体的程度,白色代表某一个像素确定属于前景,黑色代表某一个像素确定属于背景。

4. 三值蒙版(trimap):是一些前背景分离方法使用的用户输入和约束条件,用户在原图像上指定哪些像素点是确定的前景,用白色表示;哪些像素点是确定的背景,用黑色表示;哪些像素点是不确定的部分,用某种灰色表示。三值蒙版越精细准确,得到的前背景分离结果越好,但对用户的要求更高,处理时间越长。

5. 简单标记(scribble):是一些前背景分离方法使用的用户输入和约束条件,用户在原图像上以一个或多个白色点或线条标记确定的前景,以一个或多个黑色点或线条标记确定的背景,标记越多、越具有代表性,得到的前背景分离结果越好,对用户的要求也更高。简单标记与三值蒙版相比较,用户输入更简单方便,能大大减少处理时间。

6. 边缘检测算子(edge detection operator):边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化,包括深度上的不连续、表明方向不连续、物质属性变化和场景照明变化。图像边缘检测大幅度地减少了数据量,留下了图像重要的结构属性。边缘检测算子包括:Roberts Cross算子、Prewitt算子、Sobel算子、Canny算子、罗盘算子等。Canny算子是最常用的边缘检测方法。

7. 视差图(disparity map):视差就是从有一定距离的两个点上观察同一个目标所产生的方向差异。从目标看两个点之间的夹角,叫做这两个点的视差,两点之间的距离称作基线。只要知道视差角度和基线长度,就可以计算出目标和观测者之间的距离。视差图是以图像对中任一幅图像为基准,其大小为该基准图像的大小,元素值为视差值的图像。

8. 深度图(depth map):本文中的深度图是黑白二值图,是通过对图像的视差图再处理或视频背景建模后获取深度的结果,作为本文前背景分离方法的约束条件。综合考虑原始图像的颜色信息和深度信息,可以得到更好的前背景分离效果。

9. 前背景分离方程(matting equation):自然图像I可看作由前景图像F和背景图像B组合而成,I中的每个像素点是F和B中对应像素点颜色的线性组合。

  (1)

为像素点的前景透明度,。(1)式中,已知,而未知,是一个缺少条件的方程组。使用RGB颜色空间则有:

  (2)

(2)式有7个未知量,却只有3个方程,如果不加其他条件,(2)式有无穷多解。有人眼来分辨一幅图像哪些部分属于前景,哪些部分属于背景,只有一个或几个可以接受的结果,前背景分离模型为将这一过程自动化,可对前景和背景合理假设,或者增加图像数量,使方程组的解变少,使解与人眼分辨结果尽可能接近。


读论文《图像前背景分离的研究与实现》的笔记。

地址:https://www.docin.com/p-1084120800.html