Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像颜色分类器_Python_Image_Classification - Fatal编程技术网

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个索引

    第三步。尤塞