Python 图像颜色分类器
我有这个图像 我想对所有像素进行分类。此图像中像素的颜色如下所示:Python 图像颜色分类器,python,image,classification,Python,Image,Classification,我有这个图像 我想对所有像素进行分类。此图像中像素的颜色如下所示: 蓝色:水 红色:屋顶 怀特:路 黄色:浅 浅绿色:草 深绿色:树 黑色:背景 如何对所有像素进行分类。例如,如果2'列和1'行的像素是蓝色的,则将(1,2)分类为water的类,依此类推。我可以向您展示如何执行此操作以及将得到什么结果,希望您可以将其应用于Python—如果您愿意的话。我选择的武器是ImageMagick,它安装在大多数Linux发行版上,在macOS和Windows上免费提供 步骤1 首先,我使用“颜色滴管
如何对所有像素进行分类。例如,如果2'列和1'行的像素是蓝色的,则将(1,2)分类为water的类,依此类推。我可以向您展示如何执行此操作以及将得到什么结果,希望您可以将其应用于Python—如果您愿意的话。我选择的武器是ImageMagick,它安装在大多数Linux发行版上,在macOS和Windows上免费提供
步骤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种颜色,而不是原始图像中的8002种颜色
步骤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步意味着您要分配一个列表或数组(或Python调用的任何东西),每个列表或数组都有7种颜色。列表中的每个条目都有一个红色、绿色和蓝色的组件 第二步。您迭代图像中的每个像素(按行和列),以获得其红色、绿色和蓝色分量。然后计算从当前像素到7种LUT颜色的颜色距离,并取结果最小的颜色,即最近的距离。您可以使用
(thispixel.Red-LUT[n].Red)^2 + (thispixel.Green-LUT[n].Green)^2 + (thispixel.Blue-LUT[n].Blue)^2
其中n
将贯穿LUT的7个索引
第三步。您可以将输出像素设置为LUT中最接近的颜色的索引。我可以向您展示如何操作以及将得到什么结果,如果您愿意,希望您可以将其应用于Python。我选择的武器是ImageMagick,它安装在大多数Linux发行版上,在macOS和Windows上免费提供
步骤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种颜色,而不是原始图像中的8002种颜色
步骤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步意味着您要分配一个列表或数组(或Python调用的任何东西),每个列表或数组都有7种颜色。列表中的每个条目都有一个红色、绿色和蓝色的组件 第二步。您迭代图像中的每个像素(按行和列),以获得其红色、绿色和蓝色分量。然后计算从当前像素到7种LUT颜色的颜色距离,并取结果最小的颜色,即最近的距离。您可以使用
(thispixel.Red-LUT[n].Red)^2 + (thispixel.Green-LUT[n].Green)^2 + (thispixel.Blue-LUT[n].Blue)^2
其中n
将贯穿LUT的7个索引
第三步。尤塞