首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图像颜色分类器

图像颜色分类器
EN

Stack Overflow用户
提问于 2018-02-28 08:02:38
回答 1查看 1.4K关注 0票数 1

我有这张照片。

我想对所有像素进行分类。该图像中像素的颜色如下:

  1. 蓝色:水
  2. 红色:屋顶
  3. 白色:道路
  4. 黄色:浅
  5. 浅绿色:草
  6. 深绿色:树
  7. 黑色:背景

如何对所有像素进行分类。例如,如果2‘列和1’行的像素是蓝色的,那么将(1,2)分类为水类,等等。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 14:07:49

我可以向您展示如何做到这一点,以及您将得到什么样的结果,并希望您能够将其适应Python --如果您愿意的话。我选择的武器是ImageMagick,它安装在大多数Linux发行版上,可以在macOS和macOS上免费使用。

步骤1

首先,我使用了一个“颜色滴定器”工具(在Mac上称为“数字色表”),我查看您识别的7种颜色中的每一种颜色的区域,并获取它们的RGB坐标,并通过在终端中键入以下内容,对这些值进行简单的“查找表”:

代码语言:javascript
复制
# 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

现在,我将该查找表应用于图像,而不产生抖动,这样图像中的每一种颜色都被强制转换为表中最接近的颜色:

代码语言:javascript
复制
convert image.png +dither -map LUT.png result.png

该图像现在真正只有7种颜色,我们选择,而不是8,002颜色在您原来的形象!

步骤3

现在,我们遍历图像并对其进行分类,将所有蓝色像素替换为1,所有红色像素替换为2,所有白色像素替换为3,等等:

代码语言:javascript
复制
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或以下:

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

代码语言:javascript
复制
convert final.png -normalize final.png

我猜下一件事将是确定每一种封面类型的百分比。让我们先看看水。如果我们把所有是水的东西变成白色像素,而不是水变成黑色像素,我们只需看一下图像就可以计算出水覆盖率的百分比:

代码语言:javascript
复制
convert final.png -fill white -opaque "rgb(1,1,1)" -fill black +opaque white -format "%[fx:int(mean*100)]" info:
12

所以有12%的水覆盖率。要获得实际图像,请将上面的计算替换为输出文件名:

代码语言:javascript
复制
convert final.png -fill white -opaque "rgb(1,1,1)" -fill black +opaque white water.png

我们接下来试试树..。同样的程序,把所有是树的东西都变成白色,所有不是树的东西都变成黑色:

代码语言:javascript
复制
convert final.png -fill white -opaque "rgb(6,6,6)" -fill black +opaque white -format "%[fx:int(mean*100)]" info:
26

因此,26%的树木覆盖率。让我们看看他们:

代码语言:javascript
复制
convert final.png -fill white -opaque "rgb(6,6,6)" -fill black +opaque white trees.png

Python

那么,Python会发生什么呢?

第1步意味着用7种颜色分配一个列表或数组(或Python调用它们的任何东西)。列表中的每个条目都将包含一个红色、绿色和蓝色组件。

步骤2.遍历图像中的每个像素(逐行和列),获取其红色、绿色和蓝色组件。然后计算出从当前像素到7个LUT颜色中的每一个颜色的距离,并取一个结果最小的颜色,也就是最近的距离。计算距离

代码语言:javascript
复制
(thispixel.Red-LUT[n].Red)^2 + (thispixel.Green-LUT[n].Green)^2 + (thispixel.Blue-LUT[n].Blue)^2 

在这里,n将通过LUT的7个指数。

步骤3.将输出像素设置为LUT中最接近的颜色的索引。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49024632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档