我有一个用例,需要将某些图像分类为灰度或彩色。我的第一步是基于以下特征:灰度图像在一个像素处应具有r,g,b值,该值应与单个通道的值相同。对于彩色图像,同一像素处的r,g,b值可能不相同。
因此,我通过检查(r,g),(b,g)和(r,b)之间的差值进行检查,如果所有三个值都只有零,则表示灰度,否则表示颜色。
这种方法帮助我识别了许多灰度图像,但是仍然有一些图像不遵循此逻辑。谁能指定一些好的功能,以便我们可以使用opencv将图像分类为彩色或灰度?
不要问我检查通道数并进行分类,因为我们以.jpg格式加载时,这两个类都给出3。
预先感谢
答案 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
}
感谢所有建议。