2018-10-16 08:27:01 qq_33810188 阅读数 369
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    30424 人正在学习 去看看 张中强

· 能从硬件结构方面消除不利影响,最好不要从图像算法方面消除不利影响(预防隐患法则)

· 截至目前为止,图像算法没有一个标准的算法流程适合所有的图像处理,所以具体问题具体分析

· 图像算法处理的实际应用遵循海森堡不确定性原则,所以在实际应用中不断优化算法十分必要

· 图像算法处理的实际应用符合墨菲定律,所以图像算法前期的设计隐患一定会在实际应用中产生

· 图像处理算法一定是定量分析算法,模糊不定的处理方式必然会导致问题

· 图像处理问题归根结底是一个数学问题,所以扎实的数学功底必不可少!

---------------------------------------------------------------------------------------------------------------

1.图像算法的设计一定要考虑数据结构类型,不友好的数据结构会使后续的代码结构十分繁琐冗余!

2.无论函数名,还是参数名,在取名的时候千万避免名称相似(例如,如果有一个camsPixels,不可再取一个camPixels,否则在查看代码时,直观上很容易分辨错误!浪费解读代码时间!);

3.不要重复命名函数,否则哪天封装多个带有重复名称的函数时,会出现命名冲突!

4.尽量不要重复造轮子,能够借鉴的代码要借鉴并优化,不断学习别人的代码风格和代码逻辑;

5.一位优秀的算法工程师,也必须是一位不错的软件工程师!

6.

 

 

2017-11-24 22:42:45 xxxqcbQ 阅读数 254
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    30424 人正在学习 去看看 张中强

        一直想记录自己图像处理算法修炼心路历程,今天终于鼓足勇气写下第一篇,万事开头难。

        算法写了快4个月了,目前写的比较多的是基础算法,比如通用的圆、直线检测算法,还真不能小瞧这类算法,想在工程上做到又快又准,真的不是一件容易的事情。这里应该算是有bug的,又快又好应当有个明确的量化指标。

        对于圆检测的基本逻辑是:Sobel/Canny算子处理→拿出边界→边界筛选→最小二乘拟合(对噪声很敏感)。


2016-07-03 21:03:51 qq_26499769 阅读数 10186
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    30424 人正在学习 去看看 张中强
之前见了一些文章讨论了一些有趣的图像处理算法
下面总结列出:

在研究的过程中,有时候会碰到很多有意思的图像处理算法,算法极具新意,并且能够产生非常有意思的结果。

算法简介
1、图像镶嵌

图像镶嵌也叫图像混合(Image Blending)、图像剪接(Image Editing),是通过特定的图像处理方法将本来毫无关系的两幅图无缝剪辑到一起,并能够很好地融合两者之间的剪接处,产生以假乱真的效果,不信我们就来看看。

上图左边的手和嘴巴在两幅不同的图中,只要给定一个模板,就可以把一幅图中模板指定的部分无缝拼接到另外一幅图中去,从右边的结果来看是不是看上去毫无违和感?比某些人的PS技术强多了。

类似剪接效果的还有下面这种技术,该算法同样也是划定一个区域,能够将两幅图中的指定区域图像都拿出来,拼接到第三幅图上去,结果简直天衣无缝。这两个算法的技术细节可看参考文献[1][2]。同样也可以参考这位小哥的代码

2、黑白图像着色

家里有黑白的老照片,想把它变成彩色照片,看看老一辈人真实的模样,那你可以试试下面这个图像着色(Colorization)算法。你只要拿彩笔在图像上画几笔,剩下的事情就交给算法啦。这个算法除了给黑白图片着色,还能够给视频着色呢!不信就去文献[3]看看。

3、图像超分辨

还记得小时候的红白机画面么,分辨率很低,如果放大的话,渣渣的马赛克就来了,想不起来了?想想《愤怒的小鸟》那个游戏里面马赛克小鸟,实在让人心塞,如果用了这个算法效果绝对就不一样了。该超分辨算法能够将分辨率非常低的图像提取与分辨率无关的向量,最后的高分辨率图像真是碉堡了,完虐普通的最近邻插值法放大的图像。还有人提供了Python源代码呢。

4、图像去模糊

拍照片的时候手抖,拍出来的照片模糊了怎么办?可以背个三脚架,或者花钱升级相机,变成防抖的。或者你也可以使用以下的图像处理方法,拍完之后处理,就可以得到清晰的图像了。说不定哪一天珍贵的一瞬间拍模糊了,还能用来救救急。

5、图像编辑

要是拍照的时候把不需要的物体拍进来了,破坏了照片美好的意境怎么办?此时,你可能需要这种图像处理技术[6][7]:将图像中意外出现的东西去掉!看下图,前提是要指定需要去掉的区域(中间一幅Mask图像)。

如果拍上去的建筑物看上去破破烂烂的,想填补一下这个破洞,或者想干脆在图像中再复制同一个物体,可以试试下面这个方法[7][8]。顺便说一句,这两个方法都应用到了PhotoShop上了。


参考文献

[1] Peter J. Burt and Edward H. Adelson. 1983. A multiresolution spline with application to image mosaics. ACM Trans. Graph. 2, 4 (October 1983)

[2] Patrick Pérez, Michel Gangnet, and Andrew Blake. 2003. Poisson image editing. ACM Trans. Graph. 22, 3 (July 2003)

[3] Anat Levin, Dani Lischinski, and Yair Weiss. 2004. Colorization using optimization. ACM Trans. Graph. 23, 3 (August 2004)

[4] Johannes Kopf and Dani Lischinski. 2011. Depixelizing Pixel ArtACM Transactions on Graphics (Proceedings of SIGGRAPH 2011).

[5] Xu, Li, and Jiaya Jia. 2010. Two-phase kernel estimation for robust motion deblurring.ECCV. Springer Berlin Heidelberg, 2010. 157-170.

[6] Image Completion

[7] Y. Wexler, E. Shechtman and M. Irani "Space-Time Video Completion" Computer Vision and Pattern Recognition (CVPR), Washington, June 2004.

[8] Connelly Barnes, Eli Shechtman, Adam Finkelstein, and Dan B Goldman. 2009.PatchMatch: a randomized correspondence algorithm for structural image editing. ACM Trans. Graph. 28, 3, Article 24 (July 2009)

[9] Connelly Barnes, Eli Shechtman, Dan B Goldman, The Generalized PatchMatch Correspondence Algorithm, ECCV, 2010





还有一篇:


一、像素图生成向量图的算法

数字时代早期的图片,分辨率很低。尤其是一些电子游戏的图片,放大后就是一个个像素方块。
Depixelizing(http://research.microsoft.com/en-us/um/people/kopf/pixelart/)算法可以让低分辨率的像素图转化为高质量的向量图。

二、黑白图片的着色算法

让老照片自动变成彩色的算法(http://www.cs.huji.ac.il/~yweiss/Colorization/)。

三、消除阴影的算法

不留痕迹地去掉照片上某件东西的阴影的算法(http://www.cs.huji.ac.il/~danix/ShadowRemoval/index.html)。

四、HDR照片的算法

所谓"HDR照片",就是让明亮处变得更亮、让阴暗处变得更暗,从而让照片产生强烈的对比效果。

实现HDR的软件有很多,这里推荐G'MIC(http://gmic.eu/)。它是GIMP图像编辑软件的一个插件,代码全部开源。

五、消除杂物的算法

所谓"消除杂物",就是在照片上划出一块区域,然后用背景自动填补。Resynthesizer可以做到这一点,它也是GIMP的一个插件。

六、自动合成照片的算法


根据一张草图,选择原始照片,然后把它们合成在一起,生成新照片(http://www.scriptol.com/design/sketchtophoto.php)。

七、美容算法

自动对容貌进行"美化"的算法(http://www.scriptol.com/programming/algorithm-pretty-face.php)





2018-12-12 17:03:01 lengjiayi 阅读数 2286
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    30424 人正在学习 去看看 张中强

一些基本数字图像处理算法

版权声明:本文为原创文章,未经博主允许不得用于商业用途。

所有的图像算法都在DIPAlgorithm类中,并且所有算法都为抽象成员函数。我已经按照java注释规范为所有方法添加使用说明注释,具体实现可见于DIPAlgorithm.java,这里只做算法说明。

1 图像扭曲

在这里插入图片描述
模仿PS的扭曲功能,通过建立一个三角形映射网格实现对图像的扭曲。

如上图,一共设置了45个控制点围成74个三角形网格

扭曲即形变处理其实是寻找一个函数,以所有网格顶点原始坐标为输入,扭曲后所有网格顶点坐标为输出。为了简化计算任务,采用控制栅格插值方法,对每个三角网格独立计算映射关系,如下图:

在这里插入图片描述
即求解矩阵MM满足MA=BMA = B,其中AA为原顶点的齐次矩阵:

A=[x1y11x2y21x3y31] A = \begin{bmatrix} x_{1} & y_{1} & 1 \\ x_{2} & y_{2} & 1 \\ x_{3} & y_{3} & 1 \\ \end{bmatrix}

B为形变后顶点的其次矩阵:

B=[x1x2x3y1y2y3] B = \lbrack\begin{matrix} x_{1}^{'} & x_{2}^{'} & x_{3}^{'} \\ y_{1}^{'} & y_{2}^{'} & y_{3}^{'} \\ \end{matrix}\rbrack

M即为2×32 \times 3的映射矩阵,且由于三角形三点不共线,因此A为可逆阵,

M=BA1 M = BA^{- 1}

对于三角形中的点p(x, y)p\left( x,\ y \right),其映射后坐标p=M[xy1]p^{'} = M\begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix}

2 直方图计算

直方图计算实际上即求图像的概率密度函数PDF,只需遍历一次所有像素点即可获得。

3 直方图均衡化算法

对于连续图像直方图均衡化其实是种点运算f,
对不同灰度值做映射,使得所有像素频率相等。

对于点运算f,有如下性质:

DB=f(DA), HB(DB)ΔDB=HA(DA)ΔDA D_{B} = f\left( D_{A} \right),\ H_{B}\left( D_{B} \right)\Delta D_{B} = H_{A}\left( D_{A} \right)\Delta D_{A}

其中D为灰度值,H即为灰度值在图像中的频数,整理可得

HB(DB)=HA(DA)ΔDAΔDB=HA(DA)ΔDBΔDA=HA(DA)dDBdDA H_{B}\left( D_{B} \right) = \frac{H_{A}\left( D_{A} \right)\Delta D_{A}}{\Delta D_{B}} = \frac{H_{A}\left( D_{A} \right)}{\frac{\Delta D_{B}}{\Delta D_{A}}} = \frac{H_{A}\left( D_{A} \right)}{\frac{dD_{B}}{dD_{A}}}

=HA(DA)f(DA)=HA(f1(DB))f(f1(DB)) = \frac{H_{A}\left( D_{A} \right)}{f'(D_{A})} = \frac{H_{A}\left( f^{- 1}\left( D_{B} \right) \right)}{f'(f^{- 1}(D_{B}))}

即:

寻找函数f使得HB(D)H_{B}(D)为常数A0Dm,A0,Dm\frac{A_{0}}{D_{m}},A_{0},D_{m}

由(1)可知,KaTeX parse error: Expected 'EOF', got '\ ' at position 58: …\right)}{f'(D)}\̲ ̲\Rightarrow f^{…

f(D)=DmCDF(D)f\left( D \right) = D_{m}CDF(D),CDF即累积分布函数

因此只需求得直方图的前序和即可获得映射关系。

4 图像灰度化

目前比较符合人眼的灰度化权重为0.299、0.578和0.114,为了加速计算使用近似公式D=(3r+g+6b)/10D = (3r + g + 6b)/10

5 图像二值化

我使用的二值化算法为OSTU大律二值化算法。二值化操作即利用分割阈值u,将图片分为前景后景两部分。OSTU大律法认为使得前景像素和背景像素灰度方差g最大的阈值即为最佳分割阈值。

g=w0w1(u0u1)2 g = w_{0}w_{1}\left( u_{0} - u_{1} \right)^{2}

其中w0, w1w_{0},\ w_{1}为前景、后景在图像中的比例,KaTeX parse error: Expected 'EOF', got '\ ' at position 7: u_{0},\̲ ̲u_{1}为前景、后景的平均灰度。

在实现时,只需遍历所有灰度,利用CDF求出每种灰度的方差,取最大者作为阈值即可。

6 前景分离

目前主流的前景分离为深度学习算法。这里只使用了最基本的阈值分离法,分别为RGB三个通道设置不同阈值,将小于阈值的像素作为背景,大于阈值的作为前景。

7 滤波

我使用的滤波方法是高斯滤波和中值滤波,高斯滤波即使用二维高斯函数作为滤波函数,中值滤波即使用邻域的中位数作为滤波函数。

高斯滤波器为线性滤波器,可以有效消除高斯噪声。由于高斯函数离中值越近权重越大,因此相对于均值滤波器更加柔和,对边缘的保留效果更好。这里我使用的是如下矩阵做卷积:

[1232124642367632464212321] \begin{bmatrix} 1 & 2 & 3 & 2 & 1 \\ 2 & 4 & 6 & 4 & 2 \\ 3 & 6 & 7 & 6 & 3 \\ 2 & 4 & 6 & 4 & 2 \\ 1 & 2 & 3 & 2 & 1 \\ \end{bmatrix}

中值滤波器为非线性滤波器,可以有效的去除椒盐噪声和斑点噪声并且不会使图像变模糊。

8 形态学扩张和腐蚀

形态学腐蚀可记为AΘB\text{AΘB},其中A为输入图像,B为结构单元。对于二值图像,当且仅当当前像素点满足腐结构单元时才会被保留。对于灰度图像,则可类比为最小值,即

fΘb(x,y)=min{f(xx, yy)b(x,y)(x,yDb)} f\Theta b\left( x,y \right) = min\{ f\left( x - x^{'},\ y - y^{'} \right) - b(x^{'},y')|(x^{'},y^{'} \in D_{b})\}

形态学扩张可看作腐蚀的逆操作,记作ABA\bigoplus B,对于二值图像,将每个有效像素点的邻域结构单元置1,对于灰度图像则取最大值,即

fb(x,y)=max{f(xx, yy)b(x,y)(x,yDb)} f\bigoplus b\left( x,y \right) = max\{ f\left( x - x^{'},\ y - y^{'} \right) - b(x^{'},y')|(x^{'},y^{'} \in D_{b})\}

本程序将结构单元b统一设定为5*5矩形。

通过扩张和腐蚀的结合可实现结构开运算(AoB=(AΘB)BAoB = \left( \text{AΘB} \right)\bigoplus B)和结构闭运算(AoB=(AB)ΘBAoB = \left( A\bigoplus B \right)\text{ΘB})对图像进行粗化、细化、滤波等处理

9 傅里叶变换和滤波

变换公式

傅里叶变换可以将信号从时域转换到频域,因此可以看出许多时域中不明显的特征。二维傅里叶变换(CFT)公式如下:

F(u,v)=f(x,y)e2πj(ux+vy)dxdy F\left( u,v \right) = \iint_{}^{}{f\left( x,y \right)e^{- 2\pi\overrightarrow{j}(ux + vy)}}\text{dxdy}

其中j2=1,f,F{\overrightarrow{j}}^{2} = - 1,f,F,同样二维傅里叶逆变换公式如下:

f(x,y)=F(u,v)e2πj(ux+vy)dudv f\left( x,y \right) = \iint_{}^{}{F\left( u,v \right)e^{2\pi\overrightarrow{j}(ux + vy)}}\text{dudv}

对于离散函数,可以定义离散二维傅里叶变换(DFT)和逆变换:

G(m,n)=1MN0 i  M10<k<N1 g(i,k)e2πj(imM+jnN) G\left( m,n \right) = \frac{1}{\sqrt{\text{MN}}}\sum_{\begin{matrix} 0 \leq \ i\ \leq \ M - 1 \\ 0 < k < N - 1\ \\ \end{matrix}}^{}{g\left( i,k \right)e^{- 2\pi\overrightarrow{j}(\frac{\text{im}}{M} + \frac{\text{jn}}{N})}}

g(i,k)=1MN0 m  M10<n<N1 g(m,n)e2πj(imM+jnN) g\left( i,k \right) = \frac{1}{\sqrt{\text{MN}}}\sum_{\begin{matrix} 0 \leq \ m\ \leq \ M - 1 \\ 0 < n < N - 1\ \\ \end{matrix}}^{}{g\left( m,n \right)e^{2\pi\overrightarrow{j}(\frac{\text{im}}{M} + \frac{\text{jn}}{N})}}

DFT可以理解为对连续二维信号进行了频率为M,
N的采样,之后通过计算其和频域空间M*N个基向量的相关性(在该方向投影)将时域信号映射到频域。iDFT可以理解为通过M*N个基向量合成原始时域信号。

矩阵表示

傅里叶变换实际上是一种线性变换,因此在实际计算中常常将gg扩充为NNN*N方阵,此时DFT可以通过矩阵表示:G=W1gW,Wik=1Ne2πjikNG = \mathcal{W}^{- 1}g\mathcal{W},\mathcal{W}_{\text{ik}} = \frac{1}{N}e^{2\pi\overrightarrow{j}\frac{\text{ik}}{N}}

易知Wik=Wki\mathcal{W}_{\text{ik}} = \mathcal{W}_{\text{ki}},且为正交矩阵,因此W\mathcal{W}为酉矩阵,即W1=(W)T=W\mathcal{W}^{- 1} = \left( \mathcal{W}^{*} \right)^{T} = \mathcal{W}^{*}G=WgWG = \mathcal{W}^{*}g\mathcal{W},其中FFF^{*}F

由于傅里叶变换为酉变换,即Wt=W1\mathcal{W}^{t} = \mathcal{W}^{- 1}

图像的傅里叶变换

对于二维图片可以看作二维矩阵,因此可以进行DFT。二维图片经过DFT后获得的复矩阵的模矩阵可以表示每个频率信号的强度(也可看作先做自相关后再进行傅里叶变换),经过适当处理即可转化为灰度能量谱图片。

线性噪声在频域中通常为点或线,因此可以通过傅里叶变换后进行滤波再通过逆变换复原图片。

算法实现

在实际实现时,根据欧拉公式,ejt=costjsint, ejt=cost+jsinte^{- \overrightarrow{j}t} = cost - \overrightarrow{j}\text{sint},\ e^{\overrightarrow{j}t} = cost + \overrightarrow{j}\text{sint},因此傅里叶变换的核矩阵可以表示为Wik=cos(2πik)jsin(2πik)N\mathcal{W}_{\text{ik}} = \frac{\cos\left( 2\pi ik \right) - \overrightarrow{j}\sin\left( 2\pi ik \right)}{N},为方便运算将W\mathcal{W}分解为虚部系数Wlm\mathcal{W}_{\text{lm}}和实部系数Wre\mathcal{W}_{\text{re}},其中则W=Wre+jWlm\mathcal{W} = \mathcal{W}_{\text{re}} + \overrightarrow{j}\mathcal{W}_{\text{lm}}。变换结果同样分解为G=Gre+jGlmG = G_{\text{re}} + \overrightarrow{j}G_{\text{lm}},则DFT可以表示为:

G=WgW=(WrejWlm)g(Wre+jWlm)=WregWre+WlmgWlmj(WlmgWre+WregWlm) G = \mathcal{W}^{*}g\mathcal{W =}\left( \mathcal{W}_{\text{re}} - \overrightarrow{j}\mathcal{W}_{\text{lm}} \right)g\left( \mathcal{W}_{\text{re}} + \overrightarrow{j}\mathcal{W}_{\text{lm}} \right) = \mathcal{W}_{\text{re}}g\mathcal{W}_{\text{re}} + \mathcal{W}_{\text{lm}}g\mathcal{W}_{\text{lm}} - \overrightarrow{j}\left( \mathcal{W}_{\text{lm}}g\mathcal{W}_{\text{re}} + \mathcal{W}_{\text{re}}g\mathcal{W}_{\text{lm}} \right)

{Gre=WregWre+WlmgWlmGlm=WlmgWreWregWlm  \left\{ \begin{matrix} G_{\text{re}} = \mathcal{W}_{\text{re}}g\mathcal{W}_{\text{re}} + \mathcal{W}_{\text{lm}}g\mathcal{W}_{\text{lm}} \\ G_{\text{lm}} = - \mathcal{W}_{\text{lm}}g\mathcal{W}_{\text{re}} - \mathcal{W}_{\text{re}}g\mathcal{W}_{\text{lm}} \\ \end{matrix} \right.\

同理,iDFT可以表示为:

g=(Wre+jWlm)(Gre+jGlm)(WrejWlm) g = \left( \mathcal{W}_{\text{re}} + \overrightarrow{j}\mathcal{W}_{\text{lm}} \right)(G_{\text{re}} + {\overrightarrow{j}G}_{\text{lm}})\left( \mathcal{W}_{\text{re}} - \overrightarrow{j}\mathcal{W}_{\text{lm}} \right)

其中,为了将能量谱转化为可见的灰度图,为能量谱取对数值进行归一化。且由于在频域中两个维度频率都为0时(即W00\mathcal{W}_{00}处)为图像能量的总和,因此通过log(e+1)256log(W00+1)log(e + 1)*\frac{256}{\log\left( \mathcal{W}_{00} + 1 \right)}可以做进一步归一化。

2015-10-06 18:37:10 jaych 阅读数 2308
  • Java经典算法讲解

    在面试中,算法题目是必须的,通过算法能够看出一个程序员的编程思维,考察对复杂问题的设计与分析能力,对问题的严谨性都能够体现出来。一个算法的好坏,直接影响一个方法调用的性能,进而影响软件的整体性能。算法是学习所有编程语言的基础,在Java的学习过程中首先也会选择以算法起步,本次课程重点讲解Java开发中常用的基本算法。

    30424 人正在学习 去看看 张中强

最近刚接触图像算法开发,而且也是手机端的图像算法开发,一上来导师就给说说图像算法开发的过程。

图像算法开发跟普通程序的软件算法开发又不一样,图像算法主要是关注如何对图像进行处理,也就是关注的优化的对象不一样。

图像算法开发过程,一般是:
1)在PC端进行算法验证,达到所要实现的功能。因为在PC端能够更好的进行算法调试,确保功能实现。
2)PC端的优化,将算法优化到最佳状态。
3)算法移植到手机平台上,实现算法功能。
4)移动端算法优化,进行C/C++代码优化,NEON优化等等。后续将对如何进行代码优化进行总结。

在整个过程中,对算法的理解十分重要,而如何进行代码优化,NEON优化是算法实现的难点。

后续通过各种算法的实践、联系、总结,不断的加深理解。

图像处理算法工程师

阅读数 13972

FPGA的图像处理算法

阅读数 2071

图像处理算法分析

阅读数 103

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