import Image
import scipy.optimize as opt
import matplotlib.pyplot as plt
import numpy as np
# Целевая функция
def Model(a, x):
sum = a[0]
for coeff in range(1, len(a)):
sum += a[coeff] * ((x * np.sin(x)) ** coeff + np.exp(x))
return sum
index = 0
for itemFile in range(0, 250):
img = Image.open("/home/hedgehogues/project/testPNG/" + str(index) + ".png")
img.thumbnail((300, 300), Image.ANTIALIAS)
img = np.array(img.convert('L'))
weight = np.array(range(0, 10))
ErrorFunc = lambda tpl, x, y: 0.5 * (Model(tpl, x) - y) ** 2 # Функционал минимизации
y = np.histogram(img, bins = range(0, 256))
x = np.arange(0, 1, 1./255) # Нормировка
y = y[0] / float(np.max(y[0])) # Нормировка
spl = opt.leastsq(ErrorFunc, weight, args = (x, y)) # Вычисление коэффициентов
yy = Model(spl[0], x)
plt.plot(x, yy)
plt.plot(x, y)
plt.show()
index += 1
print index
Получим веса w_i, а также имея площадь, можем построить ещё одно регрессионную модель, которая будет предсказывать размер конкртеного изображения. Сделать это можно по аналогии с тем, как построена регриссионная модель выше. Введём некоторую целевую функцию и функционал минимизации. Запишем исходные данные в виде: u_i = [w_i, area]. Теперь имея в качестве исходных данных пары (u_i, total_size), аналогичным образом обучим модель и получим некоторую зависимость. По указанной зависимости можно будет предсказывать предполагаемый размер файла.
С другой стороны, можно воспользоваться более простой идеей и также, как и ранее, получить верхнюю и нижнюю оценку. Для этого посчитаем среднее значение элементов гистограммы. Построим график зависимости размера файла от среднего значения:
你问了一个困难而有趣的问题。没有人有一个明确的答案。您可以搜索一些估计中使用的压缩
DEFLATE算法PNG。顺便说一句,PNG哦 这是一种使用DEFLATE算法的无损压缩图像存储格式。该方法不是最简单的。我找到了一个相当不错的描述,它是在这里,这里,部分在这里和这里找到的. 但由于我的兴趣与数据压缩有点距离,我并没有开始回忆各种变体的霍夫曼码,而是选择了一种不同的、更便宜的方法来解决这个问题。它给出更差的结果而不是准确的结果。但是,随着我将描述的想法的适当发展,可以获得足够高质量的下限和上限。您还需要了解,使用这种方法,您始终可以选择一张从图片的一般动态中脱颖而出的图像。由于我不知道你想优化什么以及如何优化,我只会给出可以做什么的基本规定。以下所有内容都将在python 2.7. 不幸的是,我不会给出现成的解决方案,因为我不知道目标。但是根据我的经验,你可以获得很好的结果。关于确切的评估。它很可能通过研究霍夫曼代码的行为方式获得。但这将是一个艰苦的过程。问题是你需要多少。
该方法的总体思路是识别依赖
python如果你没有IDE给他,那么我建议你pyCharm。您可以在评论中询问有关安装或出现的所有问题。开始时,请务必查看 pip,这是一个包安装程序,顺便说一句,它很好地集成到pyCharm.现在关于图像。网络上充斥着各种照片、图片和其他垃圾。你可以很容易地在谷歌上找到它们。但问题是它们可以采用不同的格式。这个问题很容易解决,把他们带到
*.png。你可以这样做:我不会评论代码。他似乎是可以理解的。
因此,我首先决定根据图片的面积查看图片的大小(以下图片是图像数据库的某个实例)。不幸的是,我在这里等待一个悲伤的答案。这不是一个很好的分布。你可以看看它:
不过一般来说,就算是看这样一张图,也能给出一些估计。例如,我们可以在上限上给出一个硬边界。从图中可以看出,用下式表示:
下界分别为:
因此,固定区域的文件大小可能相差很大(几乎是 3 倍)~ 2.922。为了了解这是很多,您可以比较 3 MB 和 9 MB。300 kB 和 1Mb。差异是显而易见的。如果我们考虑非常大尺寸的图像:50 Mb 和 150 Mb,它将达到顶峰。它是什么?
我将提供您可以用来进行计算的代码:
下一个合乎逻辑的步骤是假设关于图片边长的信息是一个完全没有信息的符号,因为每张图片中隐藏了不同的信息,因此,最能提供信息的参数将与像素强度相关联。在这里我会进一步保留,为了简单起见,我将所有图像都设置为灰度。当然,如果我们不这样做,而是利用所有的信息,那么我们会得到更好的结果。但任务的复杂性有时也会增加。
为了考虑到这些信息,我们将构建图像直方图:
但是,这就是问题所在,我的图像非常大 (5000x5000),处理它们需要花费相当长的时间。这就是我吃它们的原因。我得到:
如您所见,直方图的性质得以保留。下面是一段代码,可让您构建此类直方图:
这一切该怎么办?容易地。可以构建这些直方图的近似值。这可以通过不同的方式完成。例如,借助非线性最小二乘法。我选择了一个或多或少对应于直方图的函数。最小二乘法的所有直方图均按区间归一化
[0; 1]。这就是我们得到的。几个直方图和为它们构建的最小二乘法:这个函数是用科学戳的方法选出来的,长这样:
使用 python,如果我们最小化对应于最小二乘法的函数,我们可以很容易地找到未知参数:
为了最小化,让我们遍历每个直方图的所有数据。所有这些步骤都可以独立完成:
Получим веса
w_i, а также имея площадь, можем построить ещё одно регрессионную модель, которая будет предсказывать размер конкртеного изображения. Сделать это можно по аналогии с тем, как построена регриссионная модель выше. Введём некоторую целевую функцию и функционал минимизации. Запишем исходные данные в виде:u_i = [w_i, area]. Теперь имея в качестве исходных данных пары(u_i, total_size), аналогичным образом обучим модель и получим некоторую зависимость. По указанной зависимости можно будет предсказывать предполагаемый размер файла.С другой стороны, можно воспользоваться более простой идеей и также, как и ранее, получить верхнюю и нижнюю оценку. Для этого посчитаем среднее значение элементов гистограммы. Построим график зависимости размера файла от среднего значения:
预期的问题。请注意,图表上有两种类型的点。蓝色是进行“训练”的集合。红色的是从互联网上截取的点(下载的图片)。如您所见,它们大致符合总体趋势。当然,在这种情况下,我们有异常值需要单独处理并了解其原因。此外,我们对直方图平均值的估计非常粗略。所以你不应该假装是太高质量的结果。我还注意到为单个图像构建直方图是一项代价高昂的操作。因此,对该操作进行一些近似是有意义的(例如,在图像中随机取像素并基于它们构建直方图)。
我给你代码: