怎么用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,只保留深蓝色部分,其他区域变为黑色的主要内容,如果未能解决你的问题,请参考以下文章