图像处理(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) : 图像增强 的相关文章

  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • 如何将图标放置到 QLineEdit 上?

    stackoverflow com 网站的右上角有一个带有放大镜头的搜索字段和一个灰色的 搜索 关键字 我想知道是否有可能实现相同的外观QLineEdit 如果是这样那怎么办 QLineEdit lineEdit new QLineEdit
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • Qt 文件对话框默认后缀不起作用

    我将以下代码用于 QtQuick Dialogs 1 3 和 Qt 5 10 0 下 filedialog 的新属性 我使用 Qt Creator 5 10 默认套件构建它 import QtQuick 2 10 import QtQuic
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 使用 Visual Studio 2013 构建 Qt 5.2.1 的静态版本

    几天来我一直在尝试使用 Visual Studio 2013 构建 Qt 的静态版本 我就是不明白我做错了什么 System Windows 7 64 位 Visual Studio 2013 仍安装 Visual Studio 2012
  • 退出 Qt 程序的正确方法?

    我应该如何退出 Qt 程序 例如在加载数据文件时 发现文件损坏 并且用户需要退出该应用程序或重新启动数据文件 我是不是该 call exit EXIT FAILURE call QApplication quit call QCoreApp
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 将 gnuplot 嵌入现有 QtWidget 中

    我正在用 C 创建一个 伪 实时绘图应用程序 使用 gnuplot 作为绘图后端 我的要求之一是绘图必须位于现有窗口内 而不是有一个单独的绘图窗口 gnuplot 默认为 Gnuplot 有一个选项可以指定 Qt 小部件 ID 这似乎适合我
  • Qt:在多个布局中使用一个小部件

    我有一个 QTabBar 所有选项卡都应该有相同的小部件 layout1 gt addWidget w layout2 gt addWidget w 然而打电话addWidget第二次导致该小部件在第一个布局中消失 有没有办法使用一个小部件
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实

随机推荐

  • 秦朝的军功制度

    作者 李四郎 链接 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) : 图像增强

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