<h3>灰度解(?)</h3>
<p>(下面讨论了您对“保留图像中的信息”功能的评论)</p>
<p>在我看来,你也许可以用灰度图像而不是RGB图像来解决这个问题。我知道我在做假设,但这是个想法。在</p>
<p>我将尝试一个与代码相关的简单示例,然后给出一个使用2D离散傅立叶变换的图像相似性度量示例,该变换使用灰度转换。DFT分析将有自己的部分</p>
<p>(如果你在过程中看到这个,我很抱歉。我只是想确保我的工作得以保存。)</p>
<p>基于我的假设,我将尝试你的方法来处理一些RGB图像,然后看看是否可以通过转换为灰度来解决这个问题。如果用灰度来解决这个问题,我们可以通过使用所有三个通道的组合来找到图像的相似性,从而分析灰度解决方案带来的信息损失量,每个通道分别进行比较。在</p>
<p><strong>方法</strong></p>
<p>确保我有所有的库/包/任何你想叫它们的东西。在</p>
<pre><code>> python -m pip install opencv-python
> python -m pip install scipy
> python -m pip install numpy
</code></pre>
<p>注意,在这个试验中,我使用了一些PNG图像,这些图像是在尝试使用2ddft时创建的(如下所述)。在</p>
<p><strong>确保我遇到同样的问题</strong></p>
^{pr2}$
<p>现在,让我们尝试使用灰度。如果这个方法有效,我们可以简单地找到每个RGB通道的距离。我希望它能起作用,因为我想做信息丢失分析。在</p>
<p>我们转换成灰度:</p>
<pre class="lang-py prettyprint-override"><code>>>> im1_gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
>>> im2_gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
>>> im1_gray.shape
(178, 284)
</code></pre>
<p>一个简单的<code>dist.euclidean(im1_gray, im2,gray)</code>将导致相同的<code>ValueError: Input vector should be 1-D.</code>异常,但我知道灰度图像数组(像素行数组)的结构,因此我执行以下操作。在</p>
<pre class="lang-py prettyprint-override"><code>>>> dists = []
>>> for i in range(0, len(im1_gray)):
... dists.append(dist.euclidean(im1_gray[i], im2_gray[i]))
...
>>> sum_dists = sum(dists)
>>> ave_dist = sum_dists/len(dists)
>>> ave_dist
2185.9891304058297
</code></pre>
<p>顺便说一下,这是两张原始图片:</p>
<p><a href="https://i.stack.imgur.com/63Q5M.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/63Q5M.jpg" alt="rhino1_clean.jpg"/></a></p>
<p><a href="https://i.stack.imgur.com/F4TvU.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/F4TvU.jpg" alt="rhino1_streak.jpg"/></a></p>
<p><strong>灰度工作(按摩),让我们试试颜色</strong></p>
<p>按照这个SO-answer中的一些过程,让我们执行以下操作。在</p>
<hr/>
<h3>信息保存</h3>
<p>在分析<a href="https://www.hdm-stuttgart.de/~maucher/Python/MMCodecs/html/basicFunctions.html" rel="nofollow noreferrer">here</a>之后,让我们看看我们的信息丢失。(请注意,这将是一个非常幼稚的分析,但我想对此进行分析。在</p>
<p><strong>灰度与颜色信息</strong></p>
<p>让我们看看颜色和灰度。稍后,我们可以看看我们是否保存了关于距离的信息。在</p>
<p><strong>使用灰度和所有三个通道比较不同距离测量值-使用一组图像的距离和比率。</strong></p>
<p>我不知道如何对距离进行熵测量,但我的直觉告诉我,如果我使用灰度和颜色通道计算距离,如果我没有丢失任何信息,我应该得出相似的距离比率。在</p>
<hr/>
<p>当我看到这个问题时,我的第一个想法是使用二维离散傅立叶变换,我确信在Python、NumPy或OpenCV中都有。基本上,DFT的第一个组成部分将与图像中的大图形相关。(这里是我将发表的相关研究论文:<a href="https://pdfs.semanticscholar.org/20e1/c59c9ec3efc7ebe33e7f47755649af95668b.pdf" rel="nofollow noreferrer">link</a>。我没有看得太近——欢迎任何人推荐另一个。)</p>
<p>所以,让我从Python中查找一个二维DFT,然后我将继续编写一些工作代码。在</p>
<p>(如果你在过程中看到这个,我很抱歉。我只是想确保我的工作得以保存。)</p>
<p>首先,您需要确保您有<s><code>PIL</code></s><code>Pillow</code>和{<cd5>}。似乎您有<code>NumPy</code>,但这里有一些说明。(请注意,我现在使用的是Windows操作系统)。。。在</p>
<pre><code>> python -m pip install opencv-python
> python -m pip install numpy
> python -m pip install pillow
</code></pre>
<p>现在,这里有5张图片-</p>
<p>1)犀牛形象,<code>rhino1_clean.jpg</code>(<a href="https://commons.wikimedia.org/wiki/File:Diceros_bicornis.jpg" rel="nofollow noreferrer">source</a>)</p>
<p><a href="https://i.stack.imgur.com/63Q5M.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/63Q5M.jpg" alt="rhino1_clean.jpg"/></a></p>
<p>同一张图片,上面有我在画作中画的黑色条纹,<code>rhino1_streak.jpg</code></p>
<p><a href="https://i.stack.imgur.com/F4TvU.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/F4TvU.jpg" alt="rhino1_streak.jpg"/></a></p>
<p>另一个犀牛形象,<code>rhino2_clean.jpg</code>(<a href="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRt6J559vZqhj0redUjNkV2LjNUbwX_QzahNHCn_eRkKivtK2cCXA" rel="nofollow noreferrer">source</a>)</p>
<p><a href="https://i.stack.imgur.com/iieyt.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/iieyt.jpg" alt="rhino2_clean.jpg"/></a></p>
<p>第一个河马伊玛锗<code>hippo1_clean.jpg</code>(<a href="https://commons.wikimedia.org/wiki/File:Hipop%C3%B3tamo_(Hippopotamus_amphibius),_parque_nacional_de_Chobe,_Botsuana,_2018-07-28,_DD_82.jpg" rel="nofollow noreferrer">source</a>)</p>
<p><a href="https://i.stack.imgur.com/81Ea9.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/81Ea9.jpg" alt="hippo1_clean.jpg"/></a></p>
<p>第二个河马图像,<code>hippo2_clean.jpg</code>(<a href="https://www.nationalgeographic.com/content/dam/animals/pictures/mammals/h/hippopotamus/hippopotamus_05.jpg" rel="nofollow noreferrer">source</a>)。在</p>
<p>{a13}</p>
<p>所有图片都是合理使用的。在</p>
<p>让我们进一步演示Python终端。在</p>
<p><code>>python</code></p>
<pre class="lang-py prettyprint-override"><code>>>> import PIL
>>> import numpy as np
</code></pre>
<p>首先,如果我们使用灰度的PNG图像,生活会更轻松-PNG是因为它是一个直截了当的位图(而不是压缩的图像),灰度是因为我不必显示通道的所有细节。在</p>
<pre class="lang-py prettyprint-override"><code>>>> rh_img_1_cln = PIL.Image.open("rhino1_clean.jpg")
>>> rh_img_1_cln.save("rhino1_clean.png")
>>> rh_img_1_cln_gs = PIL.Image.open("rhino1_clean.png").convert('LA')
>>> rh_img_1_cln_gs.save("rhino1_clean_gs.png")
</code></pre>
<p>对其他四个图像执行类似的步骤。我使用了PIL变量名,<code>rh_img_1_stk</code>,<code>rh_img_2_cln</code>,<code>hp_img_1_cln</code>,<code>hp_img_2_cln</code>。我得到了以下灰度图像的图像文件名,我将进一步使用这些文件名:<code>rhino1_streak_gs.png</code>,<code>rhino2_clean_gs.png</code>,<code>hippo1_clean_gs.png</code>,<code>hippo2_clean_gs.png</code>。在</p>
<p>现在,让我们得到DFT的系数。下面的代码(ref.<a href="https://stackoverflow.com/a/38483382/6505499">this SO answer</a>)将用于第一个干净的rhino图像。在</p>
<p>让我们先“看看”图像数组。这将向我们展示左上栏的网格版本,较高的值为白色,较低的值为黑色。在</p>
<p>注意,在我开始输出这个数组之前,我将设置为<code>numpy</code>默认值,参见<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html" rel="nofollow noreferrer">https://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html</a></p>
<pre class="lang-py prettyprint-override"><code>>>> np.set_printoptions(edgeitems=3,infstr='inf',
... linewidth=75, nanstr='nan', precision=8,
... suppress=False, threshold=1000, formatter=None)
</code></pre>
<pre class="lang-py prettyprint-override"><code>>>> rh1_cln_gs_array = np.array(rh_img_1_cln_gs)
>>> for i in {0,1,2,3,4}:
... print(rh1_cln_gs_array[i][:13])
...
[93 89 78 87 68 74 58 51 73 96 90 75 86]
[85 93 64 64 76 49 19 52 65 76 86 81 76]
[107 87 71 62 54 31 32 49 51 55 81 87 69]
[112 93 94 72 57 45 58 48 39 49 76 86 76]
[ 87 103 90 65 88 61 44 57 34 55 70 80 92]
</code></pre>
<p>现在,让我们运行DFT并查看结果。在开始实际的转换之前,我更改了<code>numpy</code>打印选项,使事情变得更好。在</p>
<pre class="lang-py prettyprint-override"><code>>>> np.set_printoptions(formatter={'all':lambda x: '{0:.2f}'.format(x)})
>>>
>>> rh1_cln_gs_fft = np.fft.fft2(rh_img_1_cln_gs)
>>> rh1_cln_gs_scaled_fft = 255.0 * rh1_cln_gs_fft / rh1_cln_gs_fft.max()
>>> rh1_cln_gs_real_fft = np.absolute(rh1_cln_gs_scaled_fft)
>>> for i in {0,1,2,3,4}:
... print(rh1_cln_gs_real_fft[i][:13])
...
[255.00 1.46 7.55 4.23 4.53 0.67 2.14 2.30 1.68 0.77 1.14 0.28 0.19]
[38.85 5.33 3.07 1.20 0.71 5.85 2.44 3.04 1.18 1.68 1.69 0.88 1.30]
[29.63 3.95 1.89 1.41 3.65 2.97 1.46 2.92 1.91 3.03 0.88 0.23 0.86]
[21.28 2.17 2.27 3.43 2.49 2.21 1.90 2.33 0.65 2.15 0.72 0.62 1.13]
[18.36 2.91 1.98 1.19 1.20 0.54 0.68 0.71 1.25 1.48 1.04 1.58 1.01]
</code></pre>
<p>现在,使用<code>rhino1_streak.jpg</code>执行相同过程的结果</p>
<pre class="lang-py prettyprint-override"><code>[255.00 3.14 7.69 4.72 4.34 0.68 2.22 2.24 1.84 0.88 1.14 0.55 0.25]
[40.39 4.69 3.17 1.52 0.77 6.15 2.83 3.00 1.40 1.57 1.80 0.99 1.26]
[30.15 3.91 1.75 0.91 3.90 2.99 1.39 2.63 1.80 3.14 0.77 0.33 0.78]
[21.61 2.33 2.64 2.86 2.64 2.34 2.25 1.87 0.91 2.21 0.59 0.75 1.17]
[18.65 3.34 1.72 1.76 1.44 0.91 1.00 0.56 1.52 1.60 1.05 1.74 0.66]
</code></pre>
<p>我将打印\增量值,而不是执行更全面的距离。如果需要距离,可以将此处显示的值的平方和。在</p>
<pre class="lang-py prettyprint-override"><code>>>> for i in {0,1,2,3,4}:
... print(rh1_cln_gs_real_fft[i][:13] - rh1_stk_gs_real_fft[i][:13])
...
[0.00 -1.68 -0.15 -0.49 0.19 -0.01 -0.08 0.06 -0.16 -0.11 -0.01 -0.27
-0.06]
[-1.54 0.64 -0.11 -0.32 -0.06 -0.30 -0.39 0.05 -0.22 0.11 -0.11 -0.11 0.04]
[-0.53 0.04 0.14 0.50 -0.24 -0.02 0.07 0.30 0.12 -0.11 0.11 -0.10 0.08]
[-0.33 -0.16 -0.37 0.57 -0.15 -0.14 -0.36 0.46 -0.26 -0.07 0.13 -0.14
-0.04]
[-0.29 -0.43 0.26 -0.58 -0.24 -0.37 -0.32 0.15 -0.27 -0.12 -0.01 -0.17
0.35]
</code></pre>
<p>我将只放置三个长度为5的系数数组,以展示这种方法在显示图像相似性方面的工作原理。老实说,这对我来说是个实验,所以我们看看会怎么样。在</p>
<p>您可以将这些系数与距离或其他指标进行比较。在</p>
<hr/>
<h3>有关信息保存的更多信息</h3>
<p>让我们用上述方法对信息丢失进行信息理论分析。
在分析<a href="https://www.hdm-stuttgart.de/~maucher/Python/MMCodecs/html/basicFunctions.html" rel="nofollow noreferrer">here</a>之后,让我们看看我们的信息丢失。在</p>
<hr/>
<p>祝你好运!在</p>