图像处理(1) : 图像增强

2023-11-05

​    图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘、轮廓、对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些“有用”,压缩其他“无用”信息,将图像转换为更适合人或计算机分析处理的形式。

    图像增强可以分为两类:空间域法和频域法。

    空间域可以简单地理解为包含图像像素的空间,空间域法是指空间域中,也就是图像本身,直接对图像进行各种线性或非线性运算,对图像的像素灰度值做增强处理。

    频域法则是在图像的变换域中把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。对其进行基于二维傅里叶变换的信号增强。

    空间域法又分为点运算和模板处理两大类。点运算是作用于单个像素邻域的处理方法,包括图像灰度变换、直方图修正、伪彩色增强技术;模板处理是作用于像素领域的处理方法,包括图像平滑、图像锐化等技术。

    频域法常用的方法包括低通滤波、高通滤波以及同态滤波等。

    如图概括了常用的图像增强的方法:

一、灰度变换

1.1线性灰度变换

    一般不改变像素点的坐标信息,只改变像素点的灰度值。

算子1:scale_image —— 缩放图像的灰度值。

void ScaleImage(const HObject& Image, HObject* ImageScaled, 
                const HTuple& Mult, const HTuple& Add)

原理:算子scale_image对输入的图像(Image)进行如下变换:

                                 g' := g * Mult + Add

可以通过灰度范围[GMin,GMax],然后用以下公式来确定参数

作用:拉开图像的对比度,让图像中黑的地方更黑,亮的地方更亮。

 

 

算子2:emphasize —— 增强图像的对比度。

void Emphasize(const HObject& Image, HObject* ImageEmphasize, 
               const HTuple& MaskWidth, const HTuple& MaskHeight, 
               const HTuple& Factor)

    首先,程序使用低通(平均图像)进行滤波。根据获得的灰度值(平均值)和原始灰度值(原始值)计算得到的灰度值(res),如下所示:

    通过参数3、4控制均值滤波模板的大小,数值越大,则图像对比度越强,一般配合参数5—Factor(对比度强度)一起对图像进行增强处理。

作用:增强图像的高频区域(边缘和拐角),使图像看起来更清晰。

 

1.2非线性灰度变换

    单纯的线性灰度变换可以在一定程度上解决视觉上的图像整体对比度问题,但是对图像细节部分的增强较为有限,结合非线性变换技术可以解决这一问题。非线性变换不是对图像的整个灰度范围进行扩展,而是有选择的对某一灰度范围进行扩展,其他范围的灰度则有可能被压缩。常用的非线性变换有对数变换和指数变换。

算子1:log_image —— 对图像做对数变换

void LogImage(const HObject& Image, HObject* LogImage, 
              const HTuple& Base)

    图像灰度的对数变换可以扩张数值较小的灰度范围或者压缩数值较大的灰度范围。对数变换是一种有用的非线性映射交换函数,可以用于扩展图像中范围较窄的低灰度值像素,压缩输入图像中范围较宽的高灰度值像素,使得原本低灰度值的像素部分能更清晰的呈现出来。

    对图像的灰度值取对数,得到新的灰度值,第3个参数为对数的底,默认值为’e’

算子2:pow_image — 对图像做指数变换

void PowImage(const HObject& Image, HObject* PowImage, 
              const HTuple& Exponent)

    指数变换映射关系与对数变换的不同之处在于,指数变换可以根据伽马Exponent 的不同取值有选择性地增强低灰度区域的对比度或是高灰度区域的对比度。其变换原则如下:

 

1.3直方图均衡化

    直方图均衡就是从图像的灰度图入手,建立一个0~255灰度值的直方图,统计每个灰度值在直方图中出现的次数,将灰度图中对应点的灰度值记录在直方图中,接着对该直方图进行均衡化操作,使像素的灰度值分布得更加均匀,从而增强图像整体对比度效果,使图像更加清晰。

算子1:equ_histo_image — 图像的直方图线性化

void EquHistoImage(const HObject& Image, HObject* ImageEquHisto)

起点是输入图像的直方图。对字节图像执行以下简单的灰度值转换f(g):

    h(x)描述灰度值x发生的相对频率。对于uint2图像,唯一的区别是值255被替换为另一个最大值。如果设置了此值,则从与输入图像一起存储的有效位数来计算最大值。如果没有设置,则使用系统参数“ int2_bits”的值(如果设置了该值(即,不同于-1))。如果两个值均未设置,则有效位数设置为16。

原始图直方图:

效果图直方图:

 

二、图像锐化

     图像锐化是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。

算子1:shock_filter — 对图像应用冲击过滤器。

void ShockFilter(const HObject& Image, HObject* SharpenedImage, 
                 const HTuple& Theta, const HTuple& Iterations, 
                 const HTuple& Mode, const HTuple& Sigma)

实例代码:

read_image (Image, 'datacode/ecc200/ecc200_cpu_015')
fill_interlace (Image, ImageFilled, 'odd')
shock_filter (ImageFilled, SharpenedImage, 0.5, 10, 'laplace', 1.5)

 

三、图像平滑

   频率特征是图像的灰度变化特征。低频特征是灰度变化不明显,代表图像整体轮廓。高频特征是图像灰度变化剧烈,代表图像噪声。中频特征则代表图像边缘、纹理等细节。

    什么时候使用傅里叶变换进行频域分析?

  1. 具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。

  2. 需要提取对比度低或者信噪比低的特征。

  3. 图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。

    在halcon中,使用频域进行检测,有两个步骤是比较关键的:①生成合适的滤波器;②空间域和频域之间的转换。

 

3.1均值滤波

    均值滤波的原理就是将像素灰度值与其邻域内的像素灰度值相加取平均值,该滤波器区域就如同一个小小的“窗口”,在图像左上角开始滑动,将该“窗口”内的像素灰度值相加取均值,然后将该值赋值给“窗口”中的每一个像素。

算子1:mean_image — 平均平滑。

void MeanImage(const HObject& Image, HObject* ImageMean, 
               const HTuple& MaskWidth, const HTuple& MaskHeight)

    该算子对所有输入图像(图像)的灰度值进行线性平滑。滤波器矩阵由个数(相等)组成,大小为MaskHeight x MaskWidth。卷积的结果除以MaskHeight x MaskWidth。对于边界处理,灰度值反映在图像边缘。

3.2中值滤波

    中值滤波的原理与均值滤波相似,不同的是,它以像素为中心,取一个指定形状的邻域作为滤波器,该形状可以是正方形,也可以是圆形。然后将区域内的像素灰度值进行排序,以排序结果的中值,将该中值赋值给该区域内的像素。

算子1:median_image — 用各种掩模计算中值滤波器。

void MedianImage(const HObject& Image, HObject* ImageMedian, 
                 const HTuple& MaskType, const HTuple& Radius, 
                 const HTuple& Margin)

    MaskType是邻域的形状,Radius是卷积核的尺寸,Margin是边界的处理方式,因为边界处往往无法移动滤波窗口,因此需要对像素做一些补充,

“continued”:表示延伸边界像素

“cyclic”:表示循环延伸边界像素

作用:适合去除一些孤立的噪点,保留大部分边缘信息。

3.3高斯滤波

    高斯滤波是调用一个二维离散的高斯函数,适合去除高斯噪声。

算子1:gauss_filter — 使用离散高斯函数平滑。

void GaussFilter(const HObject& Image, HObject* ImageGauss, 
                 const HTuple& Size)

    使用的离散高斯函数是

四、频域滤波

    频率特征是图像的灰度变化特征。低频特征是灰度变化不明显,代表图像整体轮廓。高频特征是图像灰度变化剧烈,代表图像噪声。中频特征则代表图像边缘、纹理等细节。

    什么时候使用傅里叶变换进行频域分析?

  1. 具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。

  2. 需要提取对比度低或者信噪比低的特征。

  3. 图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。

    在halcon中,使用频域进行检测,有两个步骤是比较关键的:①生成合适的滤波器;②空间域和频域之间的转换。

 

4.1高通滤波法

    图像中的边缘或细条等细节部分与图像频谱的高频分量相对应,因此采用高通滤波让高频分量顺利通过,使图像的边缘或细条等细节变得清楚,实现图像的锐化。高通滤波可用空频法或频域法来实现。在空间域是用卷积方法,与空域低通滤波的邻域平均法类似,不过其中的冲激响应方阵H不同。

算子1:gen_gauss_filter — 在频域生成高斯滤波器

void GenGaussFilter(HObject* ImageGauss, const HTuple& Sigma1, 
                    const HTuple& Sigma2, const HTuple& Phi, 
                    const HTuple& Norm, const HTuple& Mode, 
                    const HTuple& Width, const HTuple& Height)

    注意这里是频域的,而对图像进行平滑处理的高斯滤波是时域的高斯滤波器,其使用卷积模板滤除噪声。

原理:首先产生一个高斯核,然后根据输入的参数对这个高斯核矩阵做傅里叶变换(实现从空域或时域到频域的转换工具),得到特定模式和特定分辨率的所谓频域的滤波器,例如我要进行rft_generic的变换,那么我的高斯滤波器模式就要写为‘rft’。并通过设置参数保持频域滤波器和原图像一致。

 

算子2:rft_generic — 计算图像的实值快速傅里叶变换。

void RftGeneric(const HObject& Image, HObject* ImageFFT, 
                const HTuple& Direction, const HTuple& Norm, 
                const HTuple& ResultType, const HTuple& Width)

原理:其实gen_gauss_filter得到的滤波器,就是一个图像,虽然是频域滤波器,但是单纯看物理意义,他就是一个图像。与时域空间卷积核的物理意义是相同的。对这幅频域图进行卷积(卷积过程与时域无差别),卷积之后图像就产生了变化,比如外环得到减弱,内环得到保留(高低通滤波器的效果),或者在某个方向上得到保留(gabor滤波器的效果),再还原到时域,发现跟原图变化很大。

算子2:convol_fft — 用频域滤波器卷积图像。

void ConvolFft(const HObject& ImageFFT, const HObject& ImageFilter, 
               HObject* ImageConvol)

原理:将复合图像ImageFFT的像素乘以滤波图像滤波器的对应像素。

实例代码:

dev_close_window ()
dev_update_off ()
Path := 'lcd/mura_defects_blur_'
read_image (Image, Path + '01')
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Height, 640, 480, WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('red')
ScaleFactor := 0.4
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
for f := 1 to 3 by 1
    read_image (Image, Path + f$'.2i')
    decompose3 (Image, R, G, B)
    * correct side illumination
    rft_generic (B, ImageFFT, 'to_freq', 'none', 'complex', Width)
    gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
    convol_fft (ImageFFT, ImageGauss, ImageConvol)
    rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
    sub_image (B, ImageFFT1, ImageSub, 2, 100)
    * perform the actual inspection
    zoom_image_factor (ImageSub, ImageZoomed, ScaleFactor, ScaleFactor, 'constant')
    * avoid border effects when using lines_gauss()
    get_domain (ImageZoomed, Domain)
    erosion_rectangle1 (Domain, RegionErosion, 7, 7)
    reduce_domain (ImageZoomed, RegionErosion, ImageReduced)
    lines_gauss (ImageReduced, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
    hom_mat2d_identity (HomMat2DIdentity)
    hom_mat2d_scale_local (HomMat2DIdentity, 1 / ScaleFactor, 1 / ScaleFactor, HomMat2DScale)
    affine_trans_contour_xld (Lines, Defects, HomMat2DScale)
    * 
    dev_display (Image)
    dev_display (Defects)
    if (f < 3)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像处理(1) : 图像增强 的相关文章

  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • 如何使 Python、QT 和 Webkit 在无头服务器上工作?

    我有 Debian Linux 服务器 我用它来做各种事情 我希望它能够完成一些我需要定期完成的网络抓取工作 这段代码可以是在这里找到 http bit ly QeqvzX import sys from PyQt4 QtGui impor
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 如何使用 Qt DOM 通过此语法获取 xml 属性

    我正在使用 Qt DOM XML 解析器 并且遇到了如下属性定义的问题
  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 使 QLabel 的像素图透明

    我有一个带有 QLabel 和像素图的主窗口 我想让它透明 或不那么不透明 我正在使用下面的代码 ui gt label gt setAttribute Qt WA TranslucentBackground ui gt label gt
  • Qt 相当于 .NET 数据绑定吗?

    Qt 中是否有相当于 NET 数据绑定的功能 我想使用引用数据库中特定实体的 QString 填充一些组合框和其他小部件 但是 如果我可以将数据绑定到这些字符串 而不是基于新的组合框选择再次查询数据库 或者基于构建我自己的将使用 QStri
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入

随机推荐

  • 秦朝的军功制度

    作者 李四郎 链接 https www zhihu com question 35082355 answer 126247488 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 二十级爵位可以按实际地位和待遇
  • 计算机视觉(十一):目标检测算法:R-CNN、Fast R-CNN、Faster R-CNN

    1 引言 在计算机视觉的发展中 我们的任务也越来越复杂 对于一张图像 我们不仅要实现对于目标的分类问题 还要准确的定位目标所在图片的位置 这个就是目标检测技术 在基于深度学习的目标检测技术中 就不得不提到最著名的三个算法了 R CNN Fa
  • 解决XML中符号解析问题

    当在xml中使用大于号 gt 小于号 lt 等字符时 会影响xml的解析 1 使用转义字符 lt lt 小于号 gt gt 大于号 amp 和 apos 单引号 quot 双引号 2 使用 被这个标记所包含的内容将表示为纯文本 比如表示文本
  • LeetCode 第7天 动态规划 (子序列问题 二)编辑距离 python

    以下题目来来源 力扣 LeetCode 链接 https leetcode cn problems uncrossed lines 著作权归领扣网络所有 商业转载请联系官方授权 非商业转载请注明出处 1035 不相交的线 在两条独立的水平线
  • redis主从同步 主机down

    redis主机设置了密码 将master和slave的密码配置相同 然后将slave的配置文件中的masterauth属性进行填写 将master的密码写上去即可使用命令slaveof或者在配置文件中 replicaof对master进行指
  • 一步一步教你Pycharm的配置Python环境

    1 点开你的pycharm 创建一个python文件 很多人学习python 不知道从何学起 很多人学习python 掌握了基本语法过后 不知道在哪里寻找案例上手 很多已经做案例的人 却不知道如何去学习更加高深的知识 那么针对这三类人 我给
  • LSTM与Bi-LSTM的时间序列预测(负荷预测)——附代码

    目录 摘要 1 电力负荷预测 2 滑动窗输入结构的构建 3 LSTM 4 Bi LSTM 5 程序运行结果 6 本文Matlab代码实现 摘要 本文使用LSTM和Bi LSTM 以电力负荷预测为例对比了两者的预测性能 其中将电力负荷构造为滑
  • Ubuntu下系统CPU/内存/GPU/硬盘监控查看指令

    1 实时监控CPU及内存的 Htop监控 安装 sudo apt get install htop 启动htop htop Ubuntu默认监控器 Win A打开所有APP 搜索System Monitor System Monitor如下
  • STM32 第18讲 基本定时器(简介/计数模式/寄存器/溢出时间计算方法/实验)

    文章目录 基本定时器简介 基本定时器框图 计数模式及溢出条件 递增计数模式 递减计数模式 中间对齐计数模式 相关寄存器 控制寄存器1 TIMx CR1 DMA 中断使能寄存器 TIMx DIER 状态寄存器 TIMx SR 计数器寄存器 T
  • 【中文分词系列】 8. 更好的新词发现算法

    如果依次阅读该系列文章的读者 就会发现这个系列共提供了两种从0到1的无监督分词方案 第一种就是 中文分词系列 2 基于切分的新词发现 利用相邻字凝固度 互信息 来做构建词库 有了词库 就可以用词典法分词 另外一种是 中文分词系列 5 基于语
  • 一行代码去掉Devexpress弹窗

    使用的是 net hook方法 使用代码 using System using System Windows Forms namespace AlexDevexpressToolTest static class Program
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 用隐私换便利还是花钱护隐私?个人信息安全问题再度引发关注

    随着互联网的快速发展和大数据时代的到来 个人信息安全问题日益成为社会关注的焦点 最近一则关于某高校毕业生窃取学校内网数据并收集学生个人隐私信息的新闻再度引起了人们对于个人信息泄露的担忧 在享受便捷和高效的互联网生活的同时 我们是否需要用隐私
  • C# IEnumerator/IEnumerable

    迭代器模式 与 C IEnumerator IEnumerable Jul 21 2018 编程 阅读 迭代器模式 与 C IEnumerator IEnumerable Part1 迭代器模式 与 接口 IEnumerable IEnum
  • 从零部署halo博客

    centos docker halo搭建个人博客 从零部署halo博客 准备工作 安装宝塔面板 安装Docker管理器 下载并修改halo配置文件 直接使用本地数据库 利用容器间的关联使用容器中的数据库 以下为注意事项 配置域名访问 SSL
  • Python使用Selenium WebDriver的入门介绍及安装教程

    Selenium WebDriver 入门 一 什么是Selenium WebDriver 二 安装Selenium WebDriver 2 1 安装selenium类库 2 2 安装浏览器驱动 2 3 配置环境变量 三 编写第一个Sele
  • 【Tableau案例】神奇宝贝属性及实力强弱|数据可视化

    提前声明 神奇宝贝的数据分析仅供参考 不涉及对于神奇宝贝的各种评价 另外我是初学tableau 涉及到使用的tableau操作可能很简单 复杂的还掌握不熟练 之后会拿时间系统学习tabelau 数据预处理 该数据集有721个口袋妖怪 分别包
  • 挂载VMware esxi服务器文件夹到本地ubuntu

    概述 开发安卓项目 需要在公司服务器搭建的环境 VMware esxi 上编译代码 可以将服务器上的文件挂载到本地 在本地编辑好代码后再去服务器上编译 登录服务器 使用ssh user host方式登录 例如ssh rk3566 192 1
  • 深入理解Solidity——独立汇编

    独立汇编 Standalone Assembly 上面介绍的在Solidity中嵌入的内联汇编语言也可以单独使用 实际上 它是被计划用来作为编译器的一种中间语言 在这个目的下 它尝试达到下述的目标 使用它编写的代码要可读 即使代码是从Sol
  • 图像处理(1) : 图像增强

    图像增强就是指通过某种图像处理方法对退化的某些图像特征 如边缘 轮廓 对比度等进行处理 以改善图像的视觉效果 提高图像的清晰度 或是突出图像中的某些 有用 压缩其他 无用 信息 将图像转换为更适合人或计算机分析处理的形式 图像增强可以分为两