我有这张照片。

我想对所有像素进行分类。该图像中像素的颜色如下:
如何对所有像素进行分类。例如,如果2‘列和1’行的像素是蓝色的,那么将(1,2)分类为水类,等等。
发布于 2018-02-28 14:07:49
我可以向您展示如何做到这一点,以及您将得到什么样的结果,并希望您能够将其适应Python --如果您愿意的话。我选择的武器是ImageMagick,它安装在大多数Linux发行版上,可以在macOS和macOS上免费使用。
步骤1
首先,我使用了一个“颜色滴定器”工具(在Mac上称为“数字色表”),我查看您识别的7种颜色中的每一种颜色的区域,并获取它们的RGB坐标,并通过在终端中键入以下内容,对这些值进行简单的“查找表”:
# First make a LUT of our 7 colours
convert xc:"rgb(59,79,162)" \
xc:"rgb(230,30,35)" \
xc:"rgb(240,240,240)" \
xc:"rgb(230,230,97)" \
xc:"rgb(103,180,65)" \
xc:"rgb(47,140,87)" \
xc:black +append LUT.png这个文件(LUT.png)看起来像这样--只是小一点--我在下面放大了它,这样你就可以看到它了。实际上,它只有7x1像素:

步骤2
现在,我将该查找表应用于图像,而不产生抖动,这样图像中的每一种颜色都被强制转换为表中最接近的颜色:
convert image.png +dither -map LUT.png result.png

该图像现在真正只有7种颜色,我们选择,而不是8,002颜色在您原来的形象!
步骤3
现在,我们遍历图像并对其进行分类,将所有蓝色像素替换为1,所有红色像素替换为2,所有白色像素替换为3,等等:
convert result.png \
-fill "gray(1)" -opaque "rgb(59,79,162)" \
-fill "gray(2)" -opaque "rgb(230,30,35)" \
-fill "gray(3)" -opaque "rgb(240,240,240)" \
-fill "gray(4)" -opaque "rgb(230,230,97)" \
-fill "gray(5)" -opaque "rgb(103,180,65)" \
-fill "gray(6)" -opaque "rgb(47,140,87)" \
-fill "gray(7)" -opaque black final.png这给了我们这个非常暗的图像,因为在0-255的范围内,所有像素都是7或以下:

因此,我们使用标准化的方法将灰色延伸到全部范围:
convert final.png -normalize final.png

我猜下一件事将是确定每一种封面类型的百分比。让我们先看看水。如果我们把所有是水的东西变成白色像素,而不是水变成黑色像素,我们只需看一下图像就可以计算出水覆盖率的百分比:
convert final.png -fill white -opaque "rgb(1,1,1)" -fill black +opaque white -format "%[fx:int(mean*100)]" info:
12所以有12%的水覆盖率。要获得实际图像,请将上面的计算替换为输出文件名:
convert final.png -fill white -opaque "rgb(1,1,1)" -fill black +opaque white water.png

我们接下来试试树..。同样的程序,把所有是树的东西都变成白色,所有不是树的东西都变成黑色:
convert final.png -fill white -opaque "rgb(6,6,6)" -fill black +opaque white -format "%[fx:int(mean*100)]" info:
26因此,26%的树木覆盖率。让我们看看他们:
convert final.png -fill white -opaque "rgb(6,6,6)" -fill black +opaque white trees.png

Python
那么,Python会发生什么呢?
第1步意味着用7种颜色分配一个列表或数组(或Python调用它们的任何东西)。列表中的每个条目都将包含一个红色、绿色和蓝色组件。
步骤2.遍历图像中的每个像素(逐行和列),获取其红色、绿色和蓝色组件。然后计算出从当前像素到7个LUT颜色中的每一个颜色的距离,并取一个结果最小的颜色,也就是最近的距离。计算距离
(thispixel.Red-LUT[n].Red)^2 + (thispixel.Green-LUT[n].Green)^2 + (thispixel.Blue-LUT[n].Blue)^2 在这里,n将通过LUT的7个指数。
步骤3.将输出像素设置为LUT中最接近的颜色的索引。
https://stackoverflow.com/questions/49024632
复制相似问题