怎么用opencv和python,只保留深蓝色部分,其他区域变为黑色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用opencv和python,只保留深蓝色部分,其他区域变为黑色相关的知识,希望对你有一定的参考价值。

使用 cvInRangeS 函数过滤出深蓝色区域即可。

OpenCVchm文档上对函数的解释:
InRangeS:检查数组元素是否在两个数量之间
void cvInRangeS( const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst );
src :第一个原数组
lower:包括进的下边界.
upper :不包括进的上边界
dst :输出数组必须是 8u 或 8s 类型.
参考技术A 您好,请问您是想知道怎么用opencv和python,只保留深蓝色部分,其他区域变为黑色吗?

opencv:从RGB到灰度的转换只得到蓝色

【中文标题】opencv:从RGB到灰度的转换只得到蓝色【英文标题】:opencv: Conversion from RGB to grayscale getting only blue 【发布时间】:2017-12-10 17:41:54 【问题描述】:

我正在尝试使用 OpenCV 和 C++ 将一些 RGB 彩色图像转换为灰度图像,但我唯一能得到的是蓝色图像。Original"Converted"

Vec3b simpleAveraging(Vec3b color)
    Vec3b gray = ((float)color[0] + (float)color[1] + (float)color[2]) / 3.0;

    return gray;


Vec3b weightedAverage1(Vec3b color)
    Vec3b gray = 0.3 * (float)color[2] + 0.59 * (float)color[1] + 0.11 * (float)color[0];

    return gray;


Vec3b weightedAverage2(Vec3b color)
    Vec3b gray = 0.2126 * (float)color[2] + 0.7152 * (float)color[1] + 0.0722 * (float)color[0];

    return gray;


Vec3b weightedAverage3(Vec3b color)
    Vec3b gray = 0.299 * (float)color[2] + 0.587 * (float)color[1] + 0.114 * (float)color[0];

    return gray;


...

for(int i = 0; i < 12; i++)
    for(int y = 0; y < img[i].rows; y++)
        for(int x = 0; x < img[i].cols; x++)
            color = img[i].at<Vec3b>(Point(x, y));

            img[i].at<Vec3b>(Point(x, y)) = weightedAverage3(color);
        
    

这是一个大学项目,我的教授告诉我使用这些算法,所以我不能使用 CV_RGB2GRAY。 我用每种方法都得到了蓝色刻度。

【问题讨论】:

要么将 img 类型设置为 CV_8UC1(灰度),要么将初始 3 通道图像的所有 3 个通道设置为 weightedAverage3(颜色)。现在您只设置第一个蓝色通道。 灰度图像只有一个通道,所以返回一个cv::Vec3b没有意义,它应该是一个uint8_t 【参考方案1】:

你确定你只有 3 个频道吗?

无论如何:

uint8_t weightedAverage3(Vec3b color)
    uint8_t gray = 0.301 * (float)color[0] + 0.587 * (float)color[1] + 0.114 * (float)color[2];

    return gray;


for(int i = 0; i < 12; i++)
    for(int y = 0; y < img[i].rows; y++)
        for(int x = 0; x < img[i].cols; x++)
            color = img[i].at<Vec3b>(Point(x, y));

            img[i].at<uchar>(Point(x, y)) = weightedAverage3(color);
        
    

假设0是R,1是G,2是B。

【讨论】:

这根本不能解决 OP 问题。请注意,此处等号的右侧是单个值,而您已将其分配给 Vec3b 并将其作为 Vec3b 返回。 所以这看起来基本正确,但是您为三通道图像分配了一个 uchar 值。最好分配给一个新的单通道Mat 我想,不是吗?

以上是关于怎么用opencv和python,只保留深蓝色部分,其他区域变为黑色的主要内容,如果未能解决你的问题,请参考以下文章

python3用正则怎么删除指定字符串前面和后面的内容,只保留中间部分的内容,并存入列表?

opencv去除图片中线条,保留数字

pcb板去掉元件opencv

用opencv做一个物品识别,请讲下基本思路。

opencv:从RGB到灰度的转换只得到蓝色

如何在openCV Python中选择统一着色图的特定部分?