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

Posted

tags:

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

参考技术A 1. cv::blur 以 2*2 进行平滑
2. 以 ( (B>R && B>G) || (R>253&&G>253&&B>253) ) 为条件二值化
3. cv::dilate 以 7*7 的圆进行膨胀
4. cv::findContours找轮廓,并挑出面积(cv::contourArea)最大的轮廓
5. 在原图上画出(cv::drawContours)这个轮廓

分裂后的OpenCv轮次

【中文标题】分裂后的OpenCv轮次【英文标题】:OpenCv round after division 【发布时间】:2015-01-21 16:24:01 【问题描述】:

看下面的代码

Blue = channel[0];
Green = channel[1];
Red = channel[2];

Mat G = (Green + Blue) / 2;

其中红绿和蓝是图像的通道。在绿色和蓝色的总和为奇数的情况下,有时会进行一轮,有时会进行“修复”。例如,对于值为 120 和蓝色 45 的绿色像素,G 值为 82(因此它只需要 82,5 的整数部分)。而在另一种情况下,绿色为 106,蓝色为 33,我得到 G 的那个元素的值 70(因此,它进行了一轮,因为 (33+106)/2 = 69,5 )。

操作是什么?

【问题讨论】:

【参考方案1】:

OpenCV 使用“四舍五入”舍入模式。如果 fraction 为 0.5,则舍入到最接近的偶数。这就是为什么 82.5 舍入为 82 和 69.5 舍入为 70。

【讨论】:

谢谢。一个链接到一些关于这个的文档会很好。【参考方案2】:

这种差异发生在 opencv 源代码中 cvRound 的实现上。它的一部分是从下面的github 复制的,并添加了 cmets。

int cvRound( float value )

    double intpart, fractpart;
    fractpart = modf(value, &intpart);

    //for +ve numbers, when fraction is 0.5, odd numbers are rounded up 
    //and even numbers are rounded down 
    //and vice versa for -ve numbers

    if ((fabs(fractpart) != 0.5) || ((((int)intpart) % 2) != 0))
        return (int)(value + (value >= 0 ? 0.5 : -0.5));
    else
        return (int)intpart;

我编写了一个小示例并进行了调试,以查看在 opencv 代码中调用saturate_cast (link) 的矩阵加权加法,该代码又调用了cvRound。你可以在 github (link) 上看到。

【讨论】:

【参考方案3】:

如果你想得到一个浮点数那么你需要使用:

Mat G = (Green + Blue) / 2.0;

只是使用:

Mat G = (Green + Blue) / 2;

使用整数除法,因为整数中没有小数点,所以会被截断。

【讨论】:

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

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

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

pcb板去掉元件opencv

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

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

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