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

一、图像的分类

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)画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面;看上去是平滑连续的视觉效果,这样连续的画面叫做视频。视频技术最早是为了电视系统而发展,但现在已经发展为各种不同的格式以利消费者将视频记录下来。网络技术的发达也促使视频的纪录片段以串流媒体的形式存在于因特网之上并可被电脑接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片






2019-10-12 14:04:59 a1326243249 阅读数 26

题目

运用图像处理的方法去除上图中背景黑色沁墨印记。
picture1

解决办法

方案一

查看该图的灰度分布直方图如下
在这里插入图片描述
最简单的方法就是转化为二值图,首先转化为灰度图,然后转化为二值图

%matlab代码
c=rgb2gray(k);%转化为灰度图
c=im2bw(k,0.5);%将灰度图转化为二值图

得到如下结果
在这里插入图片描述
通过不断调整im2bw的参数得到0.4为最佳,如下
在这里插入图片描述

方案二

为了更加还原图片,我们只需去掉背景字迹即可,即将字迹颜色转换为背景色,通过PS等专业软件可以方便找到字迹颜色区间与背景色的颜色区间

%matlab代码
b=c;%创建c的备份
[m,n]=size(c);%读取c的纵横像素点
for i=1:m-1
    for j=1:n-1
        if c(i,j)>145 & c(i,j)<165
            b(i,j)=170;%将字迹部分转化为背景色
        end
    end
end

得到结果如下
在这里插入图片描述
通过对比,我们很容易发现这种处理方法达到了较好的效果,如果大家有更好地处理办法欢迎交流

2017-12-03 17:28:28 arryCC 阅读数 3309

数字图像处理


一、学习内容总结

1. 第一章 绪论

本章主要有几个目的:

  1. 定义我们称之为数字图像处理领域的范围;
  2. 通过考察几个领域,给出图像处理技术状况的概念;
  3. 讨论图像处理用到的几种方法;
  4. 概述通用目的的典型图像处理系统的组成。

1.1 什么是数字图像处理

我们给出一些定义:

  • 强度灰度:一幅图像可以被定义为一个二维函数 f(x,y),其中 x,y 是空间(平面)坐标,而在任何一处的幅值 f 被称为在该点的灰度或强度。
  • 数字图像:当 x,y 或灰度值 f有限的离散数值时,称该图像为数字图像。也就是说数字图像是由有限数量的元素组成,每个元素都有特定的位置和幅值。这些元素被称为图画元素图像元素像素
  • 数字图像处理 : 指用特定的计算机来处理数字图像。

本书中将数字图像处理界定为其输入和输出都是图像的处理。

1.2 使用数字图像处理领域的实例

  • 伽马射线成像:医学和天文。
  • X射线成像:最早用于成像的电磁辐射源之一,医学诊断。
  • 紫外波段成像 :荧光显微镜。
  • 可见光及红外线成像 :可见显微镜技术,遥感,天气预测和预报,红外卫星图像,自动视觉检测,检测丢失的部件,指纹图像。
  • 微波波段成像 :雷达。
  • 无线电波段成像 :天文学和医学(核磁共振)。
  • 其他方式 :声波成像,电子显微镜方法,(由计算机产生的)合成图像。

1.3 数字图像处理的基本步骤

这里写图片描述

1.4 图像处理系统的组成

这里写图片描述

2. 第二章 数字图像处理基础

本章主要介绍数字图像处理一些基本概念

2.1 视觉感知要素

  • 人眼的结构

    重点介绍视网膜里的两类光感受器

    • 锥状体 :对颜色高度敏感,这种视觉称为白昼视觉或者亮视觉。高照明水平下执行。
    • 杆状体 :没有彩色感觉,对低照明度敏感,称为暗视觉或微光视觉。低照明水平下执行。
  • 亮度适应与辨别

    • 亮度适应现象 :视觉系统不能同时在一个范围内工作,它是通过改变其整个灵敏度来完成这一较大变动的。
    • 韦伯比 :较大:亮度辨别能力较差;反之,较好。
  • 感知亮度 不是简单的强度的函数

    • 视觉系统往往会在不同强度区域的边界处出现“下冲”或“上冲”现象。
    • 同时对比、错觉

2.2 光和电磁波谱

  • 电磁波是能量的一种,任何有能量的物体都会释放电磁波谱。它可以用 波长 (λ)、频率(v)或能量(E) 来描述,其中

λ=c/v

E=hv

  • 光是一种特殊的电磁辐射,可以被人眼感知。
    • 单色光 是没有颜色的光,也成为无色光。唯一属性就是它的强度或者大小,用 灰度级 来表示。单色图像常被称为 灰度图像
    • 彩色光源 的质量可以用发光强度、光通量和亮度 来表示。

2.3 图像感知和获取

  • 图像获取方式

    • 使用单个传感器来获取图像
    • 使用条带传感器获取图像
    • 使用传感器阵列获取图像
  • 简单的图像形成模型

    用形如 f(x,y) 的二维函数来表示图像,那么:

    0<f(x,y)<

    f(x,y) 可以用两个分量来表征:

    • 入射分量 入射到被观察场景的光源照射总量,用i(x,y) 表示;
    • 反射分量 场景中物体所反射的光照总量,用r(x,y) 表示。

    所以有:

    f(x,y)=i(x,y)r(x,y),0<i(x,y)<,0<r(x,y)<1

2.4 图像取样和量化

  • 取样和量化的基本概念

    • 取样 :对坐标值进行数字化
    • 量化 : 对幅值数字化

    数字图像的质量在很大程度上取决于取样和量化中所用的样本数灰度级

  • 数字图像表示

    用数列矩阵来表示一幅数字图像。在实数矩阵中,每个元素称为图像单元、图像元素或像素。

    对比度 一幅图像最高和最低灰度级间的灰度差为对比度。

    存储数字图像所用的比特数为:

    b=M×N×k,M=Nb=N2k

    灰度级数L=2k

  • 空间和灰度分辨率

    • 空间分辨率 :图像中可辨别的最小细节的度量。在数量上,表示每单位距离线对数和每单位距离点数是最通用的度量(必须针对空间单位来规定才有意义)。
    • 灰度分辨率 :指在灰度级中可分辨的最小变化。
  • 图像内插

    用已知数据来估计未知位置的数据处理。是基本的图像重取样方法。可以处理图像的放大和缩小。

2.5 像素间的基本关系

  • 相邻像素

    位于坐标 (x,y) 处的像素 p 有4个水平和垂直上的相邻像素,用 N4(p) 表示;有四个对角相邻像素,用 ND(p) 表示。如果 p 位于图像边界,则某些邻点可能 落在图像外边。

  • 邻接性、连通性、区域和边界

    • 4邻接、8邻接、混合邻接
  • 距离度量

    • 欧氏距离(圆)
    • D4 城市街区距离(菱形)
    • 棋盘距离(正方形)

2.6 常用数学工具介绍

  • 阵列和矩阵操作
  • 线性操作和非线性操作
  • 算术操作
  • 集合和逻辑操作
    • 基本集合操作
    • 逻辑操作
    • 模糊集合
  • 空间操作
    • 单像素操作
    • 邻域操作
    • 几何空间变换与图像配准
  • 向量和矩阵操作
  • 图像变换

3.第三章

3.1 背景知识

  • 空间域 就是简单的包含图像像素的平面。空间域处理可用以下方式表示:

g(x,y)=T[f(x,y)],T(x,y)

  • 灰度变换函数
    s=T(r),r,s

3.2 基本灰度变换函数

  • 图像反转

    得到灰度范围为 [0,L1] 的一幅图像的反转图像:(得到等效的照片底片)

    s=L1r

  • 对数变换

    对数变换的通用形式:

    s=clog(1+r)

    扩展图像中暗像素的值,同时压缩更高灰度级的值。反对数变换的作用与此相反。

这里写图片描述

  • 幂律变换(伽马)变换

    基本形式:

    s=crγ

    γ<1 变亮,大于1变暗,c=γ=1 恒等变换。

这里写图片描述
* 分段线性变换函数
* 对比度拉伸:扩展图像灰度级动态范围处理,因此它可以跨越记录介质和显示装置的全部灰度范围。

根据$r,s$ 的取值,变换可以为线性函数和阈值处理函数。
  • 灰度级分层:突出特定图像灰度范围的亮度。有两种方法:

    • 突出范围 [A,B] 内的灰度,并将所有其他灰度降低到一个更低的级别;
    • 突出范围[A,N] 内的灰度,并保持所有其他灰度级不变。
  • 比特平面分层:突出特定比特为整个图像外观作贡献。

    • 4个高阶比特平面,特别是最后两个比特平面,包含了在视觉上很重要的大多数数据。
    • 低阶比特平面在图像中贡献更精细的灰度细节。

    得出结论:储存四个高阶比特平面将允许我们以可接受的细节来重建原图像。这样可减少50%的存储量。

3.3 直方图的处理

  • 理论基础:若一幅图像的像素倾向于占据可能的灰度级并且分布均匀,则该图像会有高对比度的外观并展示灰色调的较大变化。

  • 直方图均衡:

    • 灰度范围为 [0,L1] 的数字图像的直方图是离散函数 h(rk)=nk,其中 rk 是第 k 级灰度值,nk 是图像中灰度为rk 的像素的个数。
    • 通过转换函数T(rk)变换,得到直方图均衡化。
    • 应用:自适应对比度增强。
  • 直方图匹配:用于处理后有特殊直方图的方法。

  • 局部直方图处理:以图像中每个像素邻域中的灰度分布为基础设计变换函数,来增强图像中小区域的细节。

  • 在图像增强中使用直方图统计:提供这样一种增强图像的方法:

    在仅处理均值和方差时,实际上直接从取样值来估计它们,不必计算直方图。这些估计被称为取样均值和取样方差。

3.4 空间滤波基础

  • 空间滤波机理

    • 空间滤波器的组成:
    • 一个邻域
    • 对该邻域包围的图像像素执行的预定义操作

    滤波产生的是一个新像素,新像素的坐标等于邻域中心的坐标,像素的值是滤波操作的结果。

  • 空间相关与卷积

    • 相关:滤波器模板移过图像并计算每个位置乘积之和的处理。一个大小为m×n 的滤波器与一幅图像 f(x,y) 做相关操作,可表示为w(x,y)f(x,y)
    • 卷积:与相关机理相似,但滤波器首先要旋转180o 一个大小为m×n 的滤波器与一幅图像 f(x,y) 做j卷积操作,可表示为w(x,y)f(x,y)

3.5 平滑空间滤波器

用于模糊处理和降低噪声。

  • 平滑线性滤波器(均值滤波器)

    它使用滤波器确定的邻域内像素的平均灰度值代替图像中每个像素的值。应用:

    • 降低噪声
    • 灰度级数量不足而引起的伪轮廓效应的平滑处理
    • 去除图像的不相关细节
  • 统计排序(非线性)滤波器

    最有代表性的是中值滤波器 ,特点:

    • 将像素邻域内灰度的中值(在中值计算中,包括原像素值)代替该像素的值;
    • 对处理脉冲噪声(椒盐噪声)非常有效。

3.6 锐化空间滤波器

  • 拉普拉斯算子:最简单的各向同性微分算子,是一个线性算子。因其为微分算子,因此强调的是图像中灰度的 突变而不是灰度级缓慢变换的区域。

  • 非锐化隐蔽和高提升滤波:从原图像中减去一部分非锐化的版本。步骤:

    • 模糊原图像
    • 从原图像减去模糊图像
    • 将模板加到原图像上
  • 梯度:图像处理中的一阶微分用梯度实现。对于函数f(x) ,在坐标(x,y) 处的梯度定义为二维列向量。它指出在位置f(x,y)f的最大变化率方向。

    应用:边缘增强。

4.第四章

本章主要为傅里叶变换的原理打一个基础,并介绍在基本的图像滤波中如何使用傅里叶变换。

4.1. 基本概念

  • 傅里叶概念:任何周期函数都可以表示为不同频率的正弦和或余弦和的形式,每个正弦项和或余弦项乘以不同的系数(傅里叶级数)。
  • 傅里叶变换:在非周期函数用正弦和或余弦和乘以加权函数的积分来表示的公式。
  • 介绍复数、傅里叶级数、冲击及其取样特征、连续函数的傅里叶变换以及之前提过的卷积。

4.2. 取样与取样函数中的傅里叶变换

  • 取样

    在连续函数f(x,y) 中模拟取样的一种方法是:用一个ΔT 单位间隔的冲击串作为取样函数去乘以f(t) .

  • 取样函数的傅里叶变换

    空间域来两个函数乘积的傅里叶变换是两个函数在频率域的卷积。

  • 取样定理

    如果以超过函数最高频率的两倍的取样来获取样本,连续的带限函数可以完全从它的样本集来恢复。

4.3. DFT小结

在课本上,作者给了我们详细的总结:

这里写图片描述
这里写图片描述
这里写图片描述

4.4. 频率域滤波

  • 步骤
    • 等到填充参数PQ
    • 形成大小为P×Q 的填充后的图像fp(x,y)
    • (1)x+y 乘以fp(x,y)移到其变换中心
    • 计算上一步骤的DTF,得到F(u,v)
    • 生成实的、对称的滤波函数H(u,v)
    • 得到处理后的图像gp(x,y)
    • gp(x,y) 的做上限提取M×N区域 ,得到最终的处理结果g(x,y)
  • 空间域与频率域间的纽带是卷积定理。

4.5. 使用频率域滤波器平滑图像

三种低通滤波器来平滑图像

  • 定义总结

这里写图片描述

  • 特性
    • 理想低通滤波器(ILFP)
    • 特性:模糊和振铃。
    • 布特沃斯低通滤波器(BLPF)
    • 特性:随着阶数增高,其振铃和负值变明显。(一阶时无)
    • 高斯低通滤波器(GLPF)
    • 特性:无振铃

4.6. 使用频率域滤波器锐化图像

  • 三种高通滤波器来锐化图像
    • 定义总结

这里写图片描述
* 特性

* 理想高通滤波器(IHPF)
  * 有振铃
* 布特沃斯高通滤波器(BHPF)
  * 比IHPF更平滑
* 高斯低通滤波器(GHPF)
  * 比前两个更平滑,即使微小物体和细线条得到的结果也比较其清晰
  • 其他方式

    • 拉普拉斯算子
    • 钝化模板、高提升滤波和高频强调滤波
    • 同态滤波

4.7.选择性滤波器

处理指定频段或者频率域的小区域

  • 带阻滤波器和带通滤波器

    • 带阻滤波器
      这里写图片描述

    • 带通滤波器

    • 通过1减去带阻得到。

  • 陷波滤波器:拒绝事先定义的关于频率矩形中心的一个邻域的频率。

    • 陷波带阻滤波器

    用中心已被平移到陷波滤波中心的高通滤波器的乘积来构造。

    • 陷波带通滤波器

    通过1减去带阻得到。

2019-10-22 19:23:03 weixin_43981769 阅读数 38

数字图像处理实验


实验目的

去除如图所示图片背景(图片来源见水印):


第一次尝试

在网上查询资料后发现OpenCV有内置函cv::inpaint(),其功能主要是修复图像中的污损区域,修复效果较好,故尝试使用。

但是在仔细查阅使用文档后发现,该函数的使用需要一个掩膜才能对图像处理,而获取掩膜的难度大,不易实现,所以放弃了这种方法。

第二次尝试

在仔细看过待处理图片后,发现图片的待处理区域与其他区域对比度大,灰度值差距多,故采用阈值分割的方法对图片进行处理,并取得较好的结果。

  1. 获取全局阈值

    通过迭代的方法获得了全局阈值T1,并对三个通道分别处理,对阈值小于T1的不做处理(灰度值低,代表正常深色区域,保留);而对大于T1的像素值置为255(设置为白色)。三个通道做上述相同处理,代码及实现结果如下:

    Mat interatethreshold(Mat image)
    {
        Mat img = image.clone();
        vector<Mat>channels;
        split(img, channels);
        cout << "begin to find the threshold" << endl;
        for(int I = 0; I < 3; ++I)
        {
            double T1 = 0;
            double n1 = 0, count1 = 0, n2 = 0, count2 = 0;
            double T2 = 255; // 防止分母为0
    
            while(true)
            {
                for(int i = 0; i < (channels[I]).rows; ++i)
                {
                    for(int j = 0; j < (channels[I]).cols; ++j)
                    {
                        if(double((channels[I]).at<uchar>(i, j)) >= T1)
                        {
                            ++n1;
                           count1 += double((channels[I]).at<uchar>(i, j));  // 统计阈值两边的像素值和个数
                        }
                        else
                        {
                            ++n2;
                            count2 += double((channels[I]).at<uchar>(i, j));
                        }
                    }
                }
    
                double temp1 = count1 / n1;
                double temp2 = count2 / n2;
                T2 = (temp1 + temp2) / 2.0;
    
                if(abs(T2 - T1) <= 1e-3)    
                    break;
    
                else
                {
                    T1 = T2;
                }
    
            }
            for(int i = 0; i < (channels[I]).rows; ++i)
            {
                for(int j = 0; j < (channels[I]).cols; ++j)
                {
                    if((double)(channels[I]).at<uchar>(i, j) > T2)
                        (channels[I]).at<uchar>(i, j) = 255;
                }
            }
        }
    
        merge(channels, img);
        return img;
    }
    

可以看出效果已经非常好,达到了要求,但是仔细观察可发现图片中的横线不是很清晰,也有一些没有处理完的痕迹,所以进行第二步操作;

  1. 灰度线性变换

    利用灰度线性变换提高图片的清晰度,并将灰度范围提升至_[0, 255]_之间,实现代码及效果如下:

    Mat linearTransform(Mat image)
    {
        Mat image_1 = image.clone();
        //首先遍历图片,找出现在灰度值范围
        //首先检测是否是多通道图片
        //多通道图片需要分通道变换
        double channel = image_1.channels();
        int rows = image.rows,  cols = image.cols;
    
        //如果是单通道图片
        if(image.channels()==1)
        {
            double max = 0;
            double min = 255;
            double c = 0, d = 255;
    
            //统计现在灰度分布
            for(int i=0;i<rows;i++)
                for(int j = 0; j<cols;j++)
                {
                    double temp = image_1.at<uchar>(i,j);
                 //   cout<<temp<<endl;
                    if(temp > max)
                        max = temp;
                    if(temp < min)
                        min = temp;
                }
            cout<<min<<"     "<<max<<endl;
            //进行线性灰度变换
            for ( int i = 0; i<rows; i++)
                for ( int j = 0; j<cols; j++)
                {
                    double temp= ( d - c )/( max - min ) * (double(image_1.at<uchar>(i,j))- min)+c; 
                    image_1.at<uchar>(i,j) = (temp);
                }
                return image_1;
        }
        //如果是三通道的图片,需要对每个通道分别处理
        else
        {
            //cout<<"hhhhh"<<endl;
            vector<Mat>channels;
            split(image_1,channels);
            int count = 0;//记录当前通道数
    
            while(count!=channel)
            {         
                double c = 0, d = 255;
                double max = 0 , min = 255;
    
                for(int i = 0; i<rows;i++)
                    for (int j = 0; j<cols; j++)
                    {
                        double temp =channels[count].at<uchar>(i,j);
    //                    cout<<temp<<endl;
                        if(temp > max)
                            max = temp;
                        if(temp < min)
                            min = temp;
                   }
    
                for(int i = 0; i<rows;i++)
                    for (int j = 0; j<cols; j++)
                    {
                        double temp= ( d - c )/( max - min ) * (double(channels[count].at<uchar>(i,j))- min)+c; 
                        channels[count].at<uchar>(i,j) = temp;
                    }
                count++;
            }
    
            merge(channels, image_1);
            return image_1;
        }
    }
    
    

最 后

经过两次尝试后在阈值分割方法得到了几乎完美的结果,实现源码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>

using namespace std;
using namespace cv;

// 图片路径
const string path = "/home/xz/coding/imageprocess/finalproject/test.jpg";

/**
 * @param image 待处理图像
 * 
 * 本函数用于处理图像扫描后背景有干扰内容
 */
Mat interatethreshold(Mat img);

/**
 * @param image 待变换图像
 * 
 * 本函数用以进行灰度线性变换,变换至0~255之间
 */
Mat linearTransform(Mat image);  

int main()
{
    Mat img = imread(path);
    Mat thres = interatethreshold(img);  //寻找阈值
    Mat result = linearTransform(thres); // 增强处理后的图片

    cout << "successfully processed" << endl;
    imshow("original", img);
    imshow("test_cut", thres);
    imshow("result", result);
    waitKey(0);
    destroyAllWindows();
    imwrite("/home/xz/coding/imageprocess/finalproject/nice.jpg", result);
    imwrite("/home/xz/coding/imageprocess/finalproject/_1.jpg", thres);
    return 0;
}

Mat interatethreshold(Mat image)
{
    Mat img = image.clone();
    vector<Mat>channels;
    split(img, channels);
    cout << "begin to find the threshold" << endl;
    for(int I = 0; I < 3; ++I)
    {
        double T1 = 0;
        double n1 = 0, count1 = 0, n2 = 0, count2 = 0;
        double T2 = 255; // 防止分母为0

        while(true)
        {
            for(int i = 0; i < (channels[I]).rows; ++i)
            {
                for(int j = 0; j < (channels[I]).cols; ++j)
                {
                    if(double((channels[I]).at<uchar>(i, j)) >= T1)
                    {
                        ++n1;
                       count1 += double((channels[I]).at<uchar>(i, j));  // 统计阈值两边的像素值和个数
                    }
                    else
                    {
                        ++n2;
                        count2 += double((channels[I]).at<uchar>(i, j));
                    }
                }
            }

            double temp1 = count1 / n1;
            double temp2 = count2 / n2;
            T2 = (temp1 + temp2) / 2.0;

            if(abs(T2 - T1) <= 1e-3)    
                break;

            else
            {
                T1 = T2;
            }

        }
        for(int i = 0; i < (channels[I]).rows; ++i)
        {
            for(int j = 0; j < (channels[I]).cols; ++j)
            {
                if((double)(channels[I]).at<uchar>(i, j) > T2)
                    (channels[I]).at<uchar>(i, j) = 255;
            }
        }
    }

    merge(channels, img);
    return img;
}

Mat linearTransform(Mat image)
{
    Mat image_1 = image.clone();
    //首先遍历图片,找出现在灰度值范围
    //首先检测是否是多通道图片
    //多通道图片需要分通道变换
    double channel = image_1.channels();
    int rows = image.rows,  cols = image.cols;

    //如果是单通道图片
    if(image.channels()==1)
    {
        double max = 0;
        double min = 255;
        double c = 0, d = 255;

        //统计现在灰度分布
        for(int i=0;i<rows;i++)
            for(int j = 0; j<cols;j++)
            {
                double temp = image_1.at<uchar>(i,j);
             //   cout<<temp<<endl;
                if(temp > max)
                    max = temp;
                if(temp < min)
                    min = temp;
            }
        cout<<min<<"     "<<max<<endl;
        //进行线性灰度变换
        for ( int i = 0; i<rows; i++)
            for ( int j = 0; j<cols; j++)
            {
                double temp= ( d - c )/( max - min ) * (double(image_1.at<uchar>(i,j))- min)+c; 
                image_1.at<uchar>(i,j) = (temp);
            }
            return image_1;
    }
    //如果是三通道的图片,需要对每个通道分别处理
    else
    {
        //cout<<"hhhhh"<<endl;
        vector<Mat>channels;
        split(image_1,channels);
        int count = 0;//记录当前通道数

        while(count!=channel)
        {         
            double c = 0, d = 255;
            double max = 0 , min = 255;

            for(int i = 0; i<rows;i++)
                for (int j = 0; j<cols; j++)
                {
                    double temp =channels[count].at<uchar>(i,j);
//                    cout<<temp<<endl;
                    if(temp > max)
                        max = temp;
                    if(temp < min)
                        min = temp;
               }

            for(int i = 0; i<rows;i++)
                for (int j = 0; j<cols; j++)
                {
                    double temp= ( d - c )/( max - min ) * (double(channels[count].at<uchar>(i,j))- min)+c; 
                    channels[count].at<uchar>(i,j) = temp;
                }
            count++;
        }

        merge(channels, image_1);
        return image_1;
    }
}

脑部 CT 图像处理

阅读数 839

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