如何使用opencv在彩色图像和灰度图像之间进行分类?

时间:2018-08-10 10:41:39

标签: python opencv image-processing classification opencv-python

我有一个用例,需要将某些图像分类为灰度或彩色。我的第一步是基于以下特征:灰度图像在一个像素处应具有r,g,b值,该值应与单个通道的值相同。对于彩色图像,同一像素处的r,g,b值可能不相同。

因此,我通过检查(r,g),(b,g)和(r,b)之间的差值进行检查,如果所有三个值都只有零,则表示灰度,否则表示颜色。

这种方法帮助我识别了许多灰度图像,但是仍然有一些图像不遵循此逻辑。谁能指定一些好的功能,以便我们可以使用opencv将图像分类为彩色或灰度?

不要问我检查通道数并进行分类,因为我们以.jpg格式加载时,这两个类都给出3。

预先感谢

2 个答案:

答案 0 :(得分:1)

我怀疑,有些数字化后从来都不是灰度图像(例如,灰度图像的彩色扫描)。由于噪声,RGB值之间的差异很小。大于理想零的低阈值应该可以解决问题。

请注意,JPEG完全具有灰度选项。但是,存储图片时,您需要该模式。压缩器通常不会自动将其拾取。另外,在使用OpenCV的IMREAD_UNCHANGED进行读取时,您明确需要设置标志imread

答案 1 :(得分:1)

使用@ QuangHoang建议的方法,我得到了85%以上的准确率的结果。 这是解释的方法。

struct Actions: Decodable {
    let upvote: Status
    let read: Status

    enum CodingKeys: String, CodingKey {
        case upvote
        case read
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.upvote = try container.decode(Status.self, forKey: .upvote) {
        self.read = try container.decode(Status.self, forKey: .read)
    }
}

struct Status: Decodable {
    let delete: Bool
    let update: Bool
    let read: Bool
    let create: Bool
} 

感谢所有建议。