精华内容
下载资源
问答
  • 一维时间序列转化成二维图片

    万次阅读 多人点赞 2019-01-13 13:40:51
    原文地址:Encoding Time Series as Images 虽然现在深度学习在计算机视觉和语音识别上发展得很好...但是如果使用 Gramian Angular Field (GAF),可以把时间序列转成图片,充分利用目前机器视觉上的优势。 这篇文章...

    原文地址:Encoding Time Series as Images

    虽然现在深度学习在计算机视觉和语音识别上发展得很好,但是碰到时间序列时,构建预测模型是很难的。原因包括循环神经网络较难训练、一些研究比较难以应用,而且没有现存与训练网络,1D-CNN 不方便。

    但是如果使用 Gramian Angular Field (GAF),可以把时间序列转成图片,充分利用目前机器视觉上的优势。

    这篇文章会包括下面这些内容:

    • 数学先验知识;
    • Gram Matrix 为何可以为单变量的时间序列构建一个好的二维表示;
    • Gram Matrix 点积为何不能表示 CNN 的数据;
    • 为 CNN 准备好 Gram Matrix 结构的操作是什么;

    还会包括 Python 代码:

    • 用于 GAF 计算的 NumPy 工具;

    下面的动图展示了对数据进行极坐标编码,然后对生成的角度进行类似于 Gram 矩阵的操作:

    1. 数学先验知识

    GAF 的数学方法与内积与相应的 Gram 矩阵有很深的联系。

    1.1. 点积(Dot product)

    内积是两个向量之间的运算,用来度量它们的「相似性」。它允许使用来自传统 Euclidian Geometry 的概念:长度、角度、第二维度和第三维度的正交性。

    在二维空间上,两个向量 u u u v v v 之间的内积定义为:
    ⟨ u , v ⟩ = u 1 ⋅ v 1 + u 2 ⋅ v 2 \langle u,v\rangle=u_1 \cdot v_1+u_2 \cdot v_2 u,v=u1v1+u2v2
    或者:
    ⟨ u , v ⟩ = ∥ u ∥ ⋅ ∥ v ∥ ⋅ cos ⁡ ( θ ) \langle u,v\rangle=\|u\|\cdot \|v\|\cdot\cos{(\theta)} u,v=uvcos(θ)
    如果 u u u v ​ v​ v 的范数为 1,我们就得到:
    ⟨ u , v ⟩ = c o s ( θ ) \langle u,v\rangle=cos{(\theta)} u,v=cos(θ)
    因此,如果处理的是单位向量,他们的内积就只由角度 θ \theta θ 决定了,这个角度可以用弧度来表示。计算出来的值会在 [-1,1] 内。记住这些定理,在本文的其他位置会用到。

    注意:在 Euclidian 集合(n 维)中,两个向量的内积的正式定义为:
    ⟨ u , v ⟩ = ∑ i = 1 n u i ⋅ v i \langle u,v\rangle=\sum_{i=1}^{n}u_i\cdot v_i u,v=i=1nuivi

    1.2. Gram 矩阵(Gram Matrix)

    在线性代数和几何中,Gram 矩阵是一个有用的工具,它经常用于计算一组向量的线性相关关系。

    定义:一组 n 个向量的 Gram 矩阵是由每一对向量的点积定义的矩阵。从数学上讲,这可以解释为:
    G = ( ⟨ u 1 , v 1 ⟩ ⟨ u 1 , v 2 ⟩ ⋯ ⟨ u 1 , v n ⟩ ⟨ u 2 , v 1 ⟩ ⟨ u 2 , v 2 ⟩ ⋯ ⟨ u 2 , v n ⟩ ⋮ ⋮ ⋱ ⋮ ⟨ u n , v 1 ⟩ ⟨ u n , v 2 ⟩ ⋯ ⟨ u n , v n ⟩ ) G=\begin{pmatrix} \langle u_1,v_1\rangle & \langle u_1,v_2\rangle & \cdots & \langle u_1,v_n\rangle \\ \langle u_2,v_1\rangle & \langle u_2,v_2\rangle & \cdots & \langle u_2,v_n\rangle \\ \vdots & \vdots & \ddots & \vdots \\ \langle u_n,v_1\rangle & \langle u_n,v_2\rangle & \cdots & \langle u_n,v_n\rangle \\ \end{pmatrix} G=u1,v1u2,v1un,v1u1,v2u2,v2un,v2u1,vnu2,vnun,vn
    再有,假设所有的二维向量都是单位向量,我们会得到:
    G = ( cos ⁡ ( ϕ 1 , 1 ) cos ⁡ ( ϕ 1 , 2 ) ⋯ cos ⁡ ( ϕ 1 , n ) cos ⁡ ( ϕ 2 , 1 ) cos ⁡ ( ϕ 2 , 2 ) ⋯ cos ⁡ ( ϕ 2 , n ) ⋮ ⋮ ⋱ ⋮ cos ⁡ ( ϕ n , 1 ) cos ⁡ ( ϕ n , 2 ) ⋯ cos ⁡ ( ϕ n , n ) ) G=\begin{pmatrix} \cos{(\phi_{1,1})} & \cos{(\phi_{1,2})} & \cdots & \cos{(\phi_{1,n})} \\ \cos{(\phi_{2,1})} & \cos{(\phi_{2,2})} & \cdots & \cos{(\phi_{2,n})} \\ \vdots & \vdots & \ddots & \vdots \\ \cos{(\phi_{n,1})} & \cos{(\phi_{n,2})} & \cdots & \cos{(\phi_{n,n})} \\ \end{pmatrix} G=cos(ϕ1,1)cos(ϕ2,1)cos(ϕn,1)cos(ϕ1,2)cos(ϕ2,2)cos(ϕn,2)cos(ϕ1,n)cos(ϕ2,n)cos(ϕn,n)
    其中 Φ ( i , j ) \Phi(i,j) Φ(i,j) 是两个向量的夹角。

    关键结论:为什么要用 Gram 矩阵?

    Gram 矩阵保留了时间依赖性。由于时间随着位置从左上角到右下角的移动而增加,所以时间维度被编码到矩阵的几何结构中。

    :单变量时间序列在某种程度上无法解释数据的共现和潜在状态;我们的目标应该是找到替代的和更丰富的表示。

    2. 实现方式

    假设有一时间序列 X = x 1 , ⋯   , x n X={x_1,\cdots,x_n} X=x1,,xn

    2.1. 缩放

    使用一个限定在 [-1,1] 的最小-最大定标器(Min-Max scaler)来把时间序列缩放到 [-1,1] 里,这样做的原因是为了使内积不偏向于值最大的观测。

    在这个用例中,标准缩放器 不是合适的候选者,因为它的输出范围和产生的内部积都可能超过 [- 1,1]。

    然而,与最小-最大定标器结合,内积确实保留了输出范围:
    ⟨ ⋅ , ⋅ ⟩ : [ − 1 , 1 ] × [ − 1 , 1 ] → [ − 1 , 1 ] ( x , y ) → x ⋅ y \langle\cdot,\cdot\rangle:[-1,1]\times[-1,1]\rightarrow[-1,1] \\ (x,y)\rightarrow x\cdot y ,:[1,1]×[1,1][1,1](x,y)xy
    在 [-1,1] 中进行点积的选择并不是无害的。如非必要,把 [-1,1] 作为输入范围是非常可取的。

    2.2. 噪声图片

    缩放完时间序列之后,我们计算每一对的点积并把它们放进 Gram 矩阵里:
    G = ( x 1 ⋅ x 1 x 1 ⋅ x 2 ⋯ x 1 ⋅ x n x 2 ⋅ x 1 x 2 ⋅ x 2 ⋯ x 2 ⋅ x n ⋮ ⋮ ⋱ ⋮ x n ⋅ x 1 x n ⋅ x 2 ⋯ x n ⋅ x n ) G=\begin{pmatrix} x_1\cdot x_1 & x_1\cdot x_2 & \cdots & x_1\cdot x_n \\ x_2\cdot x_1 & x_2\cdot x_2 & \cdots & x_2\cdot x_n \\ \vdots & \vdots & \ddots & \vdots \\ x_n\cdot x_1 & x_n\cdot x_2 & \cdots & x_n\cdot x_n \\ \end{pmatrix} G=x1x1x2x1xnx1x1x2x2x2xnx2x1xnx2xnxnxn

    我们查看一下 G 的值来看一下这个图片:

    可以看到:

    1. 输出似乎遵循以 0 为中心的高斯分布。

    2. 得到的图片是有噪声的。

    前者解释了后者,因为数据的高斯分布越多,就越难将其与高斯噪声区分开来。

    这对我们的神经网络来说是个问题。此外,CNN 在处理稀疏数据方面表现更好(CNN work better with sparse data)已经得到证实。

    2.3. 非稀疏性

    高斯分布并不奇怪。当看三维内积值 z z z 的图像,对所有 ( x , y ) ∈ R ² (x, y)∈R^² (x,y)R² 的可能的组合,我们得到一个点积的三位表面:

    假设时间序列的值服从均匀分布 [-1,1],则矩阵的值服从高斯分布。下面是长度为 n 的不同时间序列的 Gram 矩阵值输出的直方图:

    3. 开始编码

    由于单变量时间序列是一维的,点积不能区分有价值的信息和高斯噪声,除了改变空间,没有其他利用「角」关系的方法。

    因此,在使用类似于 Gram 矩阵的构造之前,我们必须将时间序列编码为至少二维的空间。为此,我们将在一维时间序列和二维空间之间构造一个双射映射,这样就不会丢失任何信息。

    这种编码很大程度上是受到极坐标转换的启发,但是在这种情况下,半径坐标表示时间。

    3.1. 缩放序列

    第一步:用 Min-Max scaler 把序列缩放到 [-1,1] 上

    我们的过程与上面实现方式中类似。加上 Min-Max scaler,我们的极坐标编码将是双射的,使用 a r c c o s arccos arccos函数双射(参见下一步)。

    第二步:将缩放后的时间序列转换到「极坐标」

    需要考虑两个量,时间序列的值及其对应的时间戳。这两个变量分别用角度半径表示。

    假设我们的时间序列由 N N N 个时间戳 t t t 和对应的 x x x 组成,那么:

    • 角度是用 a r c c o s ( x ) arccos(x) arccos(x) 计算的,值在 [ 0 , π ] [0,\pi] [0,π] 之间。
    • 首先计算半径变量,我们把区间 [0,1] 分成 N N N 等份。因此,我们得到 N + 1 N+1 N+1 个分隔点 { 0 , ⋯   , 1 } \{0,\cdots,1\} {0,,1} 。然后我们丢弃 0,并连续地将这些点与时间序列关联起来。

    数学定义为:
    { ϕ i = a r c c o s ( x i ) r i = i N \begin{cases} \phi_i=arccos(x_i) \\ r_i=\frac{i}{N} \end{cases} {ϕi=arccos(xi)ri=Ni
    这些编码有几个优点:

    1. 整个编码是双射的(作为双射函数的组合)。
    2. 它通过 r r r 坐标保持时间依赖性。这个优点很有用。

    4. 时间序列的内积

    在二维空间中,接下来的问题是我们如何使用内积运算来处理稀疏性。

    4.1. 为什么不是极坐标编码值的内积呢?

    二维极坐标空间的内积有几个限制,因为每个向量的范数都根据时间依赖性进行了调整。更准确地说应该是:

    • 两个截然不同的观察结果之间的内积将偏向于最近的一个(因为范数随时间增加);
    • 当计算观测值与自身的内积时,得到的范数也是有偏差的。

    因此,如果存在一个像这样的内积运算,它应该只依赖于角度。

    4.2. 使用角度

    由于任何类似于内积的操作都不可避免地将两个不同观测值的信息转换成一个值,所以我们不能同时保留两个角度给出的信息。我们必须做出一些让步。

    为了最好地从两个角度解释个体和连接信息,作者定义了内积的另一种操作
    x ⊕ y = cos ⁡ ( θ 1 + θ 2 ) x\oplus y=\cos{(\theta_1+\theta_2)} xy=cos(θ1+θ2)
    其中 θ \theta θ 表示 x x x y y y 的角度。

    注意:我选择了不同的符号而不是使用内积,因为这个操作不满足内积的要求(线性,正定)。

    这就产生了如下的类 Gram 矩阵:
    G = ( cos ⁡ ( ϕ 1 + ϕ 1 ) cos ⁡ ( ϕ 1 + ϕ 2 ) ⋯ cos ⁡ ( ϕ 1 + ϕ n ) cos ⁡ ( ϕ 2 + ϕ 1 ) cos ⁡ ( ϕ 2 + ϕ 2 ) ⋯ cos ⁡ ( ϕ 2 + ϕ n ) ⋮ ⋮ ⋱ ⋮ cos ⁡ ( ϕ n + ϕ 1 ) cos ⁡ ( ϕ n + ϕ 2 ) ⋯ cos ⁡ ( ϕ n + ϕ n ) ) G=\begin{pmatrix} \cos{(\phi_1+\phi_1)} & \cos{(\phi_1+\phi_2)} & \cdots & \cos{(\phi_1+\phi_n)} \\ \cos{(\phi_2+\phi_1)} & \cos{(\phi_2+\phi_2)} & \cdots & \cos{(\phi_2+\phi_n)} \\ \vdots & \vdots & \ddots & \vdots \\ \cos{(\phi_n+\phi_1)} & \cos{(\phi_n+\phi_2)} & \cdots & \cos{(\phi_n+\phi_n)} \\ \end{pmatrix} G=cos(ϕ1+ϕ1)cos(ϕ2+ϕ1)cos(ϕn+ϕ1)cos(ϕ1+ϕ2)cos(ϕ2+ϕ2)cos(ϕn+ϕ2)cos(ϕ1+ϕn)cos(ϕ2+ϕn)cos(ϕn+ϕn)

    作者的选择这样做的动机是:相对于笛卡尔坐标,极坐标保留绝对的时间关系。

    优势

    1. 对角线由缩放后的时间序列的原始值构成(我们将根据深度神经网络学习到的高层特征来近似重构时间序列);
    2. 时间相关性是通过时间间隔 k k k 的方向叠加,用相对相关性来解释的。

    4.3. 稀疏表示

    现在我们来画出格拉姆角场(Gramian Angular Field)的值的密度分布:

    从上图中我们可以看出,格拉姆角场要稀疏得多。为了解释这一点,让我们用 u ⊕ v u\oplus v uv 在笛卡尔坐标重新表示:
    cos ⁡ ( θ 1 + θ 2 ) = c o s ( a r c c o s ( x ) + a r c c o s ( y ) ) = c o s ( a c r c c o s ( x ) ) ⋅ c o s ( a r c c o s ( y ) ) − s i n ( a r c c o s ( x ) ) ⋅ s i n ( a r c c o s ( y ) ) = x ⋅ y + 1 − x 2 ⋅ 1 − y 2 = ⟨ x , y ⟩ − 1 − x 2 ⋅ 1 − y 2 \begin{matrix} \cos(\theta_1+\theta_2) & = & cos(arccos(x)+arccos(y)) \\ & = & cos(acrccos(x))\cdot cos(arccos(y))-sin(arccos(x))\cdot sin(arccos(y)) \\ & = & x\cdot y+\sqrt{1-x^2}\cdot \sqrt{1-y^2} \\ & = & \langle x,y \rangle-\sqrt{1-x^2}\cdot \sqrt{1-y^2} \end{matrix} cos(θ1+θ2)====cos(arccos(x)+arccos(y))cos(acrccos(x))cos(arccos(y))sin(arccos(x))sin(arccos(y))xy+1x2 1y2 x,y1x2 1y2
    我们在上一项中注意到,新构造的运算对应于传统内积的惩罚版本
    x ⊕ y = x ⋅ y − ⟩ − 1 − x 2 ⋅ 1 − y 2 x\oplus y=x\cdot y-\rangle-\sqrt{1-x^2}\cdot \sqrt{1-y^2} xy=xy1x2 1y2
    为了了解一下这种惩罚的作用。让我们先来看看整个操作的 3D 图:

    可以看到:

    • 惩罚将平均输出移向 -1;
    • x x x y y y 越接近0,惩罚越大。主要的原因是,这些点点更接近高斯噪声;
    • 对于 x = y x=y x=y:会转换为 -1;
    • 输出很容易与高斯噪声区分开。

    缺点

    • 主对角线,然而,生成的 GAM 很大是由于 n ↦ n 2 n\mapsto n^2 nn2,而原始时间序列的长度为 n。作者建议通过使用分段聚合近似(Piecewise Aggregation Approximation)减少大小。
    • 这个操作不是真正意义上的内积。

    5. 代码

    GitHub 上可以找到将单变量时间序列转换为图像的 NumPy 实现。

    上面附上的代码,似乎直接跑不通,所以我自己利用 pyts 包写了一个可以使用的 demo,放在自己的 GitHub 上,详情可以参考另一篇博文 —— Python:使用 pyts 把一维时间序列转换成二维图片

    总结:这篇博文的灵感主要来自王志光和 Tim 的一篇详细的论文,他们利用平铺的卷积神经网络将时间序列编码为图像进行视觉检查和分类。论文中还提到了另一种有趣的编码技术:马尔科夫转换域。

    展开全文
  • Python:使用 pyts 把一维时间序列转换成二维图片

    万次阅读 多人点赞 2019-05-04 23:15:00
    在之前的一篇博客 —— 将一维时间序列转化成二维图片中,我翻译了一篇文章,说的是将一个时间序列信号转换成二维图片: 然后在文章的最后发了一个 Github 代码,这个代码是原文作者的代码,有人反应代码不能跑起来...

    在之前的一篇博客 —— 将一维时间序列转化成二维图片中,我翻译了一篇文章,说的是将一个时间序列信号转换成二维图片:

    img

    然后在文章的最后发了一个 Github 代码,这个代码是原文作者的代码,有人反应代码不能跑起来。

    这里我使用 Python 的一个第三方库 pyts,参考官方文档,改写了一下。测试了一下,可以在 Pyhon3.7 上成功运行。官方上说明的是 Python 版本应该不小于 3.5,代码已经上传至 GitHub.

    1/ 安装 pyts 库

    注: 以前有一个版本的代码使用的 pyts 库的版本为 0.7.1,目前最新版本的 pyts 库改变比较大,会出现 cannot import name 'GASF' from 'pyts.image' 的报错。该问题已经在最新 GitHub 上的版本重新写了最新版本 pyts 的代码,如果想要使用旧版本的代码,安装的时候要指定 pyts 的版本,然后使用本文中旧版本的那个代码。

    安装特定版本的 Python 包的方法,打开命令行,使用 pip 命令安装:pip install pyts==0.7.1

    2/ 准备一维时间序列

    我使用 MATLAB 生成了一个 sin x 的时间序列图,plot 出来是这样的:

    在这里插入图片描述

    总共有 512 个点,也就是最大能够生成 512 × 512 512\times 512 512×512 的图片。

    要把生成的图片保存为 .csv 文件:

    在这里插入图片描述

    3/ 转换成图片

    接下来就是简单地转换成二维图片了,先贴代码吧,或者可以在我的 GitHub 上下载,里面有批量处理和保存 GAF 图片的代码:

    使用新版本的 pyts,版本如下,这也是目前 GitHub 里面版本的代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from pyts.image import GramianAngularField
    
    sin_data = np.loadtxt('sinx.csv', delimiter=",", skiprows=0).reshape(1, -1)
    image_size = 28
    
    gasf = GramianAngularField(image_size=image_size, method='summation')
    sin_gasf = gasf.fit_transform(sin_data)
    gadf = GramianAngularField(image_size=image_size, method='difference')
    sin_gadf = gadf.fit_transform(sin_data)
    images = [sin_gasf[0], sin_gadf[0]]
    titles = ['Summation', 'Difference']
    
    fig, axs = plt.subplots(1, 2, constrained_layout=True)
    for image, title, ax in zip(images, titles, axs):
        ax.imshow(image)
        ax.set_title(title)
    fig.suptitle('GramianAngularField', y=0.94, fontsize=16)
    plt.margins(0, 0)
    plt.savefig("GramianAngularField.pdf", pad_inches=0)
    plt.show()
    

    如果是使用 0.7.1 之前版本的,可以使用下面的代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from pyts.image import GASF, GADF
    
    x = np.loadtxt(open("sinx.csv","rb"),delimiter=",",skiprows=0).T
    # print(type(x),x.shape)
    
    X = x[0:]
    X = X.reshape(1, -1)
    print(type(X),X.shape)
    image_size = 28
    gasf = GASF(image_size)
    X_gasf = gasf.fit_transform(X)
    print(X_gasf.shape)
    print(X_gasf[0,4,2],X_gasf[0,2,4])
    gadf = GADF(image_size)
    X_gadf = gadf.fit_transform(X)
    print(X_gadf[0,1,2],X_gadf[0,2,1])
    
    # Show the results for the first time series
    plt.figure(figsize=(16, 8))
    plt.subplot(121)
    plt.imshow(X_gasf[0], cmap='rainbow', origin='lower')
    plt.title("GASF", fontsize=16)
    plt.subplot(122)
    plt.imshow(X_gadf[0], cmap='rainbow', origin='lower')
    plt.title("GADF", fontsize=16)
    plt.savefig('sinx.jpg')
    plt.show()
    

    运行,出来的效果是这样的:

    在这里插入图片描述

    文中的 .csv 文件和代码都放在我的仓库中,如果对你有帮助,可以在 GitHub 中给我个 Star,这会是对我的一份鼓励与肯定!

    展开全文
  • 如何生成一维条码图片

    千次阅读 2017-02-22 21:20:03
    在创建类型对话框的列表双击”创建一维条码”. 出现一维条码参数对话框,如下图。 根据需要选择编码类型,条码颜色,然后输入条码号,单击”确定”按钮。(如果想生成透明的条码图,需要勾上”透明”选择框)...

    运行多多涂吧,在主窗口点击新建按钮,打开新建类型对话框。

    在创建类型对话框的列表双击创建一维条码”.

    出现一维条码参数对话框,如下图。 根据需要选择编码类型,条码颜色,然后输入条码号,单击确定按钮。(如果想生成透明的条码图,需要勾上透明选择框)。


    条码编码类型有:Ean8 , Ean13 , Code128A , Code128B , Code128C , Code39 , Code93 , Code25 , HIBC128 , HIBC39 , Code128Auto , GS1-128 , I2of5 , Codebar , MSI ,Code11 ,UPC-A , UPC-E , Industria25 , Matrix25 , Toshiba ,ISBN等。

     

    一个漂亮的标准的条码图产生了。 如下图:


    下面是使用多多涂吧创建的不同颜色和编码类型的条码,不知道老司机能否一样看出是哪些编码的条码。


    最新多多涂吧下载地址:

    http://www.hdy.net.cn/softshare/tuba.htm

    QQ交流群: 295860595   



    展开全文
  • 方式一(生成一维码):使用架包-->jbarcode.jar 点击打开链接 实现代码可以直接使用,如下: import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.lang....

    方式一(生成一维码):使用架包-->jbarcode.jar    点击打开链接

    实现代码可以直接使用,如下:

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.Constructor;
    
    import javax.imageio.stream.FileImageOutputStream;
    
    import org.jbarcode.JBarcode;
    import org.jbarcode.encode.BarcodeEncoder;
    import org.jbarcode.encode.Code39Encoder;
    import org.jbarcode.paint.BaseLineTextPainter;
    import org.jbarcode.paint.EAN13TextPainter;
    import org.jbarcode.paint.WideRatioCodedPainter;
    import org.jbarcode.paint.WidthCodedPainter;
    import org.jbarcode.util.ImageUtil;
    
    /**
     * 
     *@类功能说明:      java生成一维码图片
     *@修改人员名:     yang
     *@修改日期:    2016-2-24 下午05:00:11
     *@创建时间:    2016-2-24 下午05:00:11
     * ----------------------------------------------------------------------------------------------------------
     *  修改次数         修改人员    修改内容                       修改原因                     
     *                                                                                                                                   
     * @备注:
     * @版本: V1.0
     */
    public class TestSingleImage {
    public static void main(String args[]){
    try {
    byte[] by=createDimensionalCode("1234567893243213454");
    //生成的图片高度是固定60像素
    String path="F:12w3.jpg";//输出gif、jpg、png、bmp都行
    //打开输入流
    FileImageOutputStream imageOutput = new FileImageOutputStream(new File(path));
    //将byte数组写入本地硬盘
    imageOutput.write(by, 0, by.length);
    //关闭输入流
       imageOutput.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    /**
    * 
    * @方法功能备注:  生成最综一维码字节数组
    * @创建人员:              yang
    * @修改日期:        2016-2-24 下午05:27:25
    * ----------------------------------------------------------------------------------------------------------------
    * @修改历史
    *        序号                日期                         修改人             修改原因 
    *                       
    *
    * ----------------------------------------------------------------------------------------------------------------               
    * @备注:
    * @param value
    * @return:
    * @测试结果:通过 
    */
        public static byte[] createDimensionalCode(String value){  
            return createCode(Code39Encoder.class,value,false);  
        }  
          
        public static byte[] createCode(Class<?> clazz,String value,boolean checkDigit){  
              try{  
                  JBarcode localJBarcode = new JBarcode(getUnique(clazz),WidthCodedPainter.getInstance(),EAN13TextPainter.getInstance());    
                  localJBarcode.setPainter(WideRatioCodedPainter.getInstance());    
                  localJBarcode.setTextPainter(BaseLineTextPainter.getInstance());    
                  localJBarcode.setCheckDigit(checkDigit);  
                  localJBarcode.setShowCheckDigit(checkDigit);  
                  return getImageBytes(localJBarcode.createBarcode(value));    
              }catch (Exception e) {  
                e.printStackTrace();  
                return null;  
            }  
        }  
        //获取唯一单例的对象
        private static BarcodeEncoder getUnique(Class<?> clazz) throws Exception{  
            Constructor<?>[] constructors=clazz.getDeclaredConstructors();  
     onstructor<?> privateConstructor = constructors[0];  
    
    
    
            privateConstructor.setAccessible(true);  
            return (BarcodeEncoder)privateConstructor.newInstance();  
        }  
          
        //获得图片字节码数组
        private static byte[] getImageBytes(BufferedImage paramBufferedImage) throws IOException{    
              return ImageUtil.encode(paramBufferedImage,"jpeg", 96, 100);  
        }    
    
    }       

     

    方式二(生成一维码和二维码):在eclipse中生成(此方法比方式一好用!)

    1、pox.xml内容

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven_ssm</groupId>
    <artifactId>ssm</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>ssm Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <!-- 表示开发的时候引入,发布的时候不会加载此包 -->
    <scope>test</scope>
    </dependency>
    
    <!-- 导入谷歌生成一维码、二维码的包 -->
    <dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.1.0</version>
    </dependency>
    <dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.1.0</version>
    </dependency>
    </dependencies>
    <build>
    <finalName>ssm</finalName>
    </build>
    </project>
    
    

    2、在src/main/java目录中,新建java代码

    (1)一维码:SimpleCodeUtil.java

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.MultiFormatWriter;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Result;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    
    public class SimpleCodeUtil{
    
    //输出的图片格式
    private static final String FORMAT="PNG";
    
    /**
    * 生成条形码<br>
    * <b>注意</b>条形码的宽度不能等于图片的宽度,否则解析不出来,如果解析不出来,请加大offset的值
    * @param contents 内容
    * @param dest 条形码图片地址
    * @param width 宽度
    * @param height 高度
    * @param offset 偏移量
    * @throws WriterException
    * @throws FileNotFoundException
    * @throws IOException
    */
    public static void encode(String contents,String dest,int width,int height,int offset)
    
            throws WriterException, FileNotFoundException, IOException{
    contents=new String(contents.getBytes("UTF-8"),"ISO-8859-1");
    /**
    * Code128A字符集 包括大写字母、数字、常用标点符号和一些控制符。
    Code128B字符集 包括大小写字母、数字、常用标点符号。
    Code128C字符集 为纯数字序列。
    Code128Auto 是将上述三种字符集最佳优化组合。
    EAN128条码生成 是由UPC/EAN指定代表意义规则的128码,编码方式同code128条码。
    Code39条码生成字符集包括数字 、大写字母以及- . $ / + % * 空格等字符,其中"*"
    
    只用于标记开始和结束。
    Code93条码生成是 full ASCII 模式,可使用ASCII全部128个字符。
    库德巴码(Codabar)条码生成,字符集包括数字和- $ : /. + 以及ABCD等字符,
    
    其中ABCD只用于开始或者结尾,作为标识符使用。
    交叉25码(Interleaved 2 of 5)条码生成,常用于物流管理,字符集仅为数字且个数为偶数,
    
                           为奇数将自动在前面加"0"。
    Code11条码 只允许11种字元,分别是0-9和"-",为降低检查错误率,可使用两位的检验码。
    MSI条形码 必须是纯的数字0-9,带有一位检验码。
    EAN13商品条码是纯数字,而且位数是12位,在编码过后外加一位校验码,组成13位数字。
    EAN8商品条码是纯数字,而且位数是7位,在编码过后外加一位校验码,组成8位数字。
    UPC-A条码商品条码是纯数字,而且位数是11位,在编码过后外加一位校验码,
    
                                      组成12位数字,主要在美国和加拿大使用。
    UPC-E条码商品条码是纯数字,是由UPC-A缩减而成,位数是7位,而且首位必须为0,
    
                                   在编码过后外加一位校验码,组成8位数字。 
    */
    BitMatrix matrix=new MultiFormatWriter().encode(contents,BarcodeFormat.CODE_128, 
    
                                                            width-offset, height);
    // BitMatrix matrix=new MultiFormatWriter().encode(contents, BarcodeFormat.EAN_13, 
    
                                                           width-offset, height);
    MatrixToImageWriter.writeToStream(matrix, FORMAT, new FileOutputStream(new File(dest)));
    }
    
    /**
    *          解析条形码
    * @param dest 要解码的图片地址
    * @return String 条形码内容
    */
    public static String decode(String dest) throws IOException, NotFoundException{
    BufferedImage image=ImageIO.read(new File(dest));
    LuminanceSource source=new BufferedImageLuminanceSource(image);
    BinaryBitmap imageBinaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); 
    Result result = new MultiFormatReader().decode(imageBinaryBitmap,null);
            return result.getText();
    }
    
    /**
    * 以条形码 693 69838 0001 3 为例
    此条形码分为4个部分,从左到右分别为:
    1-3位:共3位,对应该条码的693,是中国的国家代码之一。
    
                               (690--695都是中国大陆的代码,由国际上分配)
    4-8位:共5位,对应该条码的69838,代表着生产厂商代码,由厂商申请,国家分配
    9-12位:共4位,对应该条码的0001,代表着厂内商品代码,由厂商自行确定
    第13位:共1位,对应该条码的3,是校验码,依据一定的算法,由前面12位数字计算而得到
    (公式第13位算法
    1:取出该数的奇数位的和,c1=6+3+9+3+0+0=21;
    2:取出该数的偶数位的和,c2=9+6+8+8+0+1=32;
    3:将奇数位的和与“偶数位的和的三倍”相加。
    4:取出结果的个位数:117(117%10=7);
    5:用10减去这个个位数:10-7=3;
    6:对得到的数再取个位数(对10去余)3%10=3
    参考:<a href="http://baike.baidu.com/view/13740.htm?fr=aladdin">百度百科-条形码
    * @return String 校验码
    */
    public static String checksum(String countryCode,String factoryCode,String productCode) 
    
                     throws Exception{
    String temp=countryCode+factoryCode+productCode;
    if(!(isNumber(countryCode)&&isNumber(factoryCode)&&isNumber(productCode))){
    throw new Exception("不能含有非数字字符");
    }
    if(countryCode.length()!=3){
    throw new Exception("国家地区代码不合规范,必须3位");
    }
    if(factoryCode.length()!=5){
    throw new Exception("厂商代码不合规范,必须5位");
    }
    if(productCode.length()!=4){
    throw new Exception("产品代码不合规范,必须4位");
    }
    char []code=temp.toCharArray();
    
    int oddSum=0;
    int evenSum=0;
    for(int i=0;i<code.length;i++){
    if((i+1)%2==1){
    oddSum+=Integer.valueOf(code[i]+"");
    }else{
    evenSum+=Integer.valueOf(code[i]+"");
    }
    }
    int digit=(10-((oddSum+evenSum*3)%10))%10;
    
    return temp+digit;
    }
    
    /**
    * 校验数字
    * @param number 数字
    * @return Boolean
    */
    public static boolean isNumber(String number) {
    if (null == number || "".equals(number))
    return false;
    String regex = "[0-9]*";
    return number.matches(regex);
    }
    
    /** 测试程序是否正常
    * @param args
    * @throws Exception 
    */
    public static void main(String[] args) throws Exception {
    System.out.println("校验并写入:"+checksum("695", "32321", "2133"));
    SimpleCodeUtil.encode(checksum("695", "32321", "2133"), "C:\\Target.PNG", 192, 60,10);
    System.out.println("解析结果:"+BarCode.decode("C:\\Target.PNG"));
    
    //生成19位一维码,需要修改成为:BarcodeFormat.CODE_128
    SimpleCodeUtil.encode("1602071443012001406", "F:\\Target.PNG", 192, 60,10);
    }
    }

     

    (2)二维码:DoubleCodeUtil.java

    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.Binarizer;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.ChecksumException;
    import com.google.zxing.FormatException;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Result;
    import com.google.zxing.WriterException;
    import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.QRCodeReader;
    import com.google.zxing.qrcode.QRCodeWriter;
    public class DoubleCodeUtil{
    //输出的图片格式
    private static final String FORMAT="PNG";
    /**
    *  生成一张二维码图片
    * @param contents 码的内容
    * @param dest 图片输出地址
    * @param width  图片宽度(像素)
    * @param height 图片高度(像素)
    */
    public static void encode(String contents,String dest,int width,int height) throws WriterException, FileNotFoundException, IOException{
    contents=new String(contents.getBytes("UTF-8"),"ISO-8859-1");
    QRCodeWriter writer=new QRCodeWriter();
    BitMatrix matrix=writer.encode(contents, BarcodeFormat.QR_CODE, width, height);
    //MatrixToImageWriter.writeToFile(matrix, format, new File(dest));     //过时的方法,所以不推荐使用
    MatrixToImageWriter.writeToStream(matrix, FORMAT, new FileOutputStream(new File(dest)));
    }
    /**
    * 从一张图片解析出二维码信息
    * @param dest 目标地址
    * @return String 二维码信息
    * @throws IOException
    * @throws NotFoundException
    * @throws ChecksumException
    * @throws FormatException
    */
    public static String decode(String dest) throws IOException, NotFoundException, ChecksumException, FormatException{
    QRCodeReader reader=new QRCodeReader();
    BufferedImage image=ImageIO.read(new File(dest));
    LuminanceSource source=new BufferedImageLuminanceSource(image);
    Binarizer binarizer = new HybridBinarizer(source);
    BinaryBitmap imageBinaryBitmap = new BinaryBitmap(binarizer  );  
    Result result = reader.decode(imageBinaryBitmap);
                   //System.out.println("result = "+ result.toString());  
                   // System.out.println("resultFormat = "+ result.getBarcodeFormat());  
    
    //返回解析结果
                   return result.getText();
    }
    //测试是否正确
    public static void main(String[] args) throws WriterException, IOException, NotFoundException, ChecksumException, FormatException {
    //生成二维码图片
    
        DoubleCodeUtil.encode("http://www.xdemo.org/", "F:\\123.png", 192, 200);
    
    //解析二维码内容
    System.out.println(DoubleCodeUtil.decode("F:\\123.png"));
    }
    }
    
    

     

    展开全文
  • js生成一维码(条形码)

    热门讨论 2013-05-27 08:42:46
    (function() { if (!exports) var exports = window; var BARS = [212222,222122,222221,121223,121322,131222,122213,122312,132212,221213,221312,231212,112232,122132,122231,113222,123122,123221,223211,...
  • 1、一维条形码:输入信息生成一维条形码(超市、仓储使用) 2、简单二维码:输入信息生成二维码 3、图片二维码:输入信息、选择图片路径生成含图片的二维码 4、打印:根据生成的编码图片打印输出 C#项目环境为VS...
  • C# 一维条码生成源码

    热门讨论 2012-08-23 14:25:16
    C#源码开发,提供一维码生成,并可以保存图片。C#源码开发,提供一维码生成,并可以保存图片。C#源码开发,提供一维码生成,并可以保存图片
  • JAVA一维数组求和

    千次阅读 2019-11-06 17:47:32
    public class Main { public static void main(String[] args) { int num[]={1,2,3,4,5,6,7,8,9,10}; //定义一维数组 int sum = 0; System.out.println("一维数组中个元素之和为:"); for(int ...
  • 图片的二维数组转一维数组 降维

    千次阅读 2018-07-24 17:39:19
    我这里用的是python3,网上的其他的版本全是自己写的通过两个for循环,...图片本质就相当于个二数组或者二矩阵(这里的图片指的是灰度图) 先在代码中引入库 import cv2 as cv import numpy as np...
  • C# 生成和读取读取一维码二维码

    热门讨论 2015-12-30 19:29:19
    C# 生成和读取读取一维码二维码。输入条码数字内容,然后便可以生成一维条形码和二维条形码,并可以保存为图片
  • java生成一维码和二维码

    千次阅读 2017-10-31 11:23:22
    我也没有自己写,也是拿着源码进行看和修改的,然后生成自己想要的二维码和一维码,还是很不错的,所以分享一下。 首先第一步,需要导入jar包,我把我用的jar包放上来吧 jar包下载链接: 将包导入好项目之后就...
  • 2、一维卷积 3、通道 3.1若输入数据的通道数为3则 3.2三通道二维卷积 4、多个滤波器 5、三维卷积 6、一维卷积用于: 自然语言处理(近义词反义词个数channel,词向量大小size,(chanel,size)) 二维卷...
  • 使用python进行图片处理,现在需要读出图片的任意一块区域,并将其转化为一维数组,方便后续卷积操作的使用。 下面使用两种方法进行处理: convert 函数 from PIL import Image import numpy as np import ...
  • 在OpenCV里图像数据与一维数组转换

    千次阅读 2019-10-10 17:45:37
    通过读取文件之后,生成的图像数据一般是二或三数组,每个数组元素是8位字节大小。有时候从网络里接收到串数据,它是字节顺序的,比如有30000个字节,想要把它转换为300X100的图像大小,这个怎么样操作呢?又...
  • keras实战-入门之一维卷积

    千次阅读 2019-07-16 20:40:52
    keras实战-入门之一维卷积一维卷积 一维卷积 最近接触到一维卷积,最开始的时候觉得应该很简单...二维卷积比较常见,基本上一个图片的样本的维度是(高,宽,通道),而一维是(高,宽),而对于句子来说,比如I am Jack...
  • 用java一维码批量生成(条码)图片

    热门讨论 2009-07-30 10:52:31
    按公司的要求自己测试好久才整出来的,好用,给大家共享一下,有什么问题可以问我
  • 刚开始学习lstm,要用lstm做图像预测,考虑到lstm的结构,初步想先把图片转成一维的数组,在输入到lstm网络中训练。琢磨了好几天终于是转成了   试了很多办法, io模块读取文件夹下多个图片很方便,但是好像不能...
  • 文章目录一、一维卷积1.1 介绍1.2 类别1.2.1 一维Full卷积1.2.2 一维Same卷积1.2.3 一维Valid卷积1.3 具备深度的一维卷积1.4 具备深度的张量与多个卷积核的卷积二、转置卷积2.1 定义2.2 过程2.3 计算2.4 转置卷积的...
  • 浅谈从一维空间到十一维空间

    千次阅读 2020-03-07 16:52:23
    标题从一维空间到十一为空间 序言 蒙特梭利说过“我听过的我会忘记,看过的我会记得,但只有我做过的我才会懂得”。所以决定来写写博客,加深自己的一个印象,第一篇博客,来与大家分享,探讨关于空间维度的这样一...
  • 四维矩阵存储多张3维图片

    千次阅读 2018-08-01 08:13:42
    最近申请基金,想到一个... 这里实现一个简单的四维矩阵存储多张一维图片例子,供大家参考。  对于通道的定义,比如原图是RGB3通道,一千张图片放到四维矩阵,通道数还是3。  之前给的代码太繁琐,这...
  • 在网上找了很久的vc生成一维码,最终找到了BCEncode这个动态链接库,本例程所使用的BCEncode不会跳出提示信息,可以生成一个一维码保存到当前文件夹中的code.bmp中。由于没有库文件,所以只能使用了显示链接方式。...
  • 深度学习笔记(50) 一维到三维推广 1. 2维数据 2. 1维数据 3. 3维数据 1. 2维数据 从卷积神经网络框架,到如何使用它进行图像识别、对象检测、人脸识别与神经网络转换 即使大部分讨论的图像数据,某种意义上...
  • 图解一维卷积层(PyTorch)

    千次阅读 2020-12-08 20:10:41
    图解一维卷积层(PyTorch) 在NLP中,我们需要对文本做embedding表示,那么embedding之后的文本做一维卷积运算的过程到底是什么样子的呢?我们给出下图加以说明
  • matlab将一维数据批量保存为图片的两种方式 1.print 2.imwrite %% 假定DATA1为200*1024的矩阵,需要画出每一行的波形,即单波形大小为1*1024 %% 确定图片保存路径及文件名 for i = 1:size(DATA1,1) path = 'D:\...
  • zxing读取一维条码的原理

    千次阅读 2017-01-18 09:02:37
    zxing读取一维条码主要涉及4个类,分别是LuminanceSource、Binarizer、BinaryBitmap和OneDReader。第1、2和4是抽象类,根据对象的不同有不同的具体实现。...一维条码解码时,从图片的中间行开始,交替
  • (8)卷积神经网络如何处理一维时间序列数据?

    万次阅读 多人点赞 2019-05-30 11:40:41
    (8)卷积神经网络如何处理一维时间序列数据? 概述 许多文章都关注于二维卷积神经网络(2D CNN)的使用,特别是图像识别。而一维卷积神经网络(1D CNNs)只在一定程度上有所涉及,比如在自然语言处理(NLP)中的...
  • 一维条形码识别的整个过程原理通俗易懂讲解

    万次阅读 多人点赞 2019-01-14 13:28:38
    以下为一个示意图,一维条形码一共有如下几个区域组成(其实一个条形码下面已经给出了代表哪些数字了,我写的这篇文章讲述其原理,教机器如何读取) 首先明白如下几点: 一、条码的黑色条表示二进制的1,...
  • 在c语言中用二级指针指向一维数组,(*变量名)的值为什么与数组名的值不一样啊![图片说明](https://img-ask.csdn.net/upload/201801/21/1516535735_222948.png)
  • 怎么用matlab画个已知图片里曲线的二或者三坐标图,大神求解????
  • 在网上找资料的过程中,发现并没有特别细致的讲解分类图像和分类一维向量的做法,导致我捅咕了有几天才弄明白,可能使我比较菜吧......现在在这里记录一下。 首先需要明确,前文我们已经讲解了包装数据集的方法,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,456
精华内容 72,582
关键字:

一维图片