opencv之颜色过滤只留下图片中的红色区域操作


Posted in Python onJune 05, 2020

如图,这次需要在图片中找到卷尺的红色刻度,所以需要对图像做过滤,只留下红色部分。

opencv之颜色过滤只留下图片中的红色区域操作

一开始的想法是分别找到RGB值,然后找到红色区域的部分保留就可以了,不过好像很难确定红色区域的RGB取值范围,所以要把图片转化到HSV空间中去。

在opencv中直接使用cvCvtColor函数就可以啦。

IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );

cvCvtColor(image,hsv,CV_BGR2HSV);

opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) ,S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80),V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。

所以接下来要做的就是遍历图像,获取图像每个像素点的H,S,V分量,然后做判断,满足条件的就保留,不满足的就赋值为黑色。

我是用opencv中的IplImage来存储图片的。

IplImage获取像素点的方式如下:

CvScalar s_hsv = cvGet2D(hsv, j, i);//获取像素点为(i, j)点的HSV的值,i是width值,j是height值

IplImage对像素点赋值的方式如下:

CvScalar s;

cvSet2D(hsv, j ,i, s);//对(i,j)处的像素点赋值

分别取得H,S,V分量,注意图像转化的时候BGR2HSV,所以s.val[0]是B或H的值,s.val[1]是G或S的值,s.val[2]则是R或V的值。

因为师弟喜欢用CvMat,所以输入都改成了CvMat,使用的时候inputImage是希望过滤的图片,outputImage则为输出图片,因为outputImage会在函数中进行空间申请与赋值,所以传入参数的时候直接把它设成NULL就可以了。

另外要注意一点,因为是对彩色图像做实验,所以如果传入的图片不是3通道的彩色图片,那么就会出内存错误。

以下打开图片或创建图片的方式都是单通道方式,会出现内存错误。

IplImage *input = cvLoadImage(path, 0),
CvMat* M = cvCreateMat(4,4,CV_32FC1); //或是8UC1, 因为C1表示nChannel = 1,也就是单通道

void colorFilter(CvMat *inputImage, CvMat *&outputImage)
{
 int i, j;
 IplImage* image = cvCreateImage(cvGetSize(inputImage), 8, 3);
 cvGetImage(inputImage, image); 
 IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 ); 
 
 cvCvtColor(image,hsv,CV_BGR2HSV);
 int width = hsv->width;
 int height = hsv->height;
 for (i = 0; i < height; i++)
 for (j = 0; j < width; j++)
 {
 CvScalar s_hsv = cvGet2D(hsv, i, j);//获取像素点为(j, i)点的HSV的值 
 /*
 opencv 的H范围是0~180,红色的H范围大概是(0~8)∪(160,180) 
 S是饱和度,一般是大于一个值,S过低就是灰色(参考值S>80),
 V是亮度,过低就是黑色,过高就是白色(参考值220>V>50)。
 */
 CvScalar s;
 if (!(((s_hsv.val[0]>0)&&(s_hsv.val[0]<8)) || (s_hsv.val[0]>120)&&(s_hsv.val[0]<180)))
 {
 s.val[0] =0;
 s.val[1]=0;
 s.val[2]=0;
 cvSet2D(hsv, i ,j, s);
 }
 
 }
 outputImage = cvCreateMat( hsv->height, hsv->width, CV_8UC3 );
 cvConvert(hsv, outputImage);
 cvNamedWindow("filter");
 cvShowImage("filter", hsv);
 waitKey(0);
 cvReleaseImage(&hsv);
}

关于函数还有一点要说明,H分量我取得是(0,8),(120,180),S与V分量没有做筛选,如果按照注释部分的进行筛选结果不是很好。

结果如图:

opencv之颜色过滤只留下图片中的红色区域操作

补充知识:opencv实现图像去除单一颜色背景

思路

opencv之颜色过滤只留下图片中的红色区域操作

因为背景是固定颜色,很容易筛选出背景,然后将其设为白色完全透明即可。

代码

#coding=utf-8
import cv2 as cv
bg_color = [197, 102, 6]
threshold = 3000

def calc_diff(pixel):
'''
计算pixel与背景的离差平方和,作为当前像素点与背景相似程度的度量
'''
  return (pixel[0]-bg_color[0])**2 + (pixel[1]-bg_color[1])**2 + (pixel[2]-bg_color[2])**2

def remove_bg():
  image_path = './logo.png'
  logo = cv.imread(image_path)
  logo = cv.cvtColor(logo, cv.COLOR_BGR2BGRA) #将图像转成带透明通道的BGRA格式
  h, w = logo.shape[0:2]
  for i in range(h):
    for j in range(w):
      if calc_diff(logo[i][j]) < threshold:
      #若果logo[i][j]为背景,将其颜色设为白色,且完全透明
        logo[i][j][0] = 255
        logo[i][j][1] = 255
        logo[i][j][2] = 255
        logo[i][j][3] = 0
 
  cv.imwrite("./logo_rmbg.png", logo)
        
if __name__ == '__main__':
  remove_bg()

使用方法

修改第5行的bg_color为图片背景的bgr值,以及第6行的threshold(threshold越大,覆盖的像素越多)。

效果:

opencv之颜色过滤只留下图片中的红色区域操作

emmm,事实证明背景附近的颜色不是严格的背景色,后来将字填充后好多了。

opencv之颜色过滤只留下图片中的红色区域操作

以上这篇opencv之颜色过滤只留下图片中的红色区域操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之不要红头文件(2)
Sep 28 Python
Python开发常用的一些开源Package分享
Feb 14 Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Python堆排序原理与实现方法详解
May 11 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
python3 property装饰器实现原理与用法示例
May 15 Python
将python安装信息加入注册表的示例
Nov 20 Python
python的slice notation的特殊用法详解
Dec 27 Python
Python参数传递及收集机制原理解析
Jun 05 #Python
python如何进行矩阵运算
Jun 05 #Python
Opencv求取连通区域重心实例
Jun 04 #Python
Python中zip函数如何使用
Jun 04 #Python
Python中有几个关键字
Jun 04 #Python
Python如何转换字符串大小写
Jun 04 #Python
如何在Python对Excel进行读取
Jun 04 #Python
You might like
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
laravel请求参数校验方法
2019/10/10 PHP
如何让页面加载完成后执行js
2013/06/26 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
JQ实现新浪游戏首页幻灯片
2015/07/29 Javascript
基于Css3和JQuery实现打字机效果
2015/08/11 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
js禁止表单重复提交
2017/08/29 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
详解js类型判断
2018/05/22 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
Python序列操作之进阶篇
2016/12/08 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
Django的分页器实例(paginator)
2017/12/01 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
Python Pexpect库的简单使用方法
2019/01/29 Python
对Django url的几种使用方式详解
2019/08/06 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Django之腾讯云短信的实现
2020/06/12 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
网络体系结构及协议的定义
2014/03/13 面试题
中学老师的自我评价
2013/11/07 职场文书
大学生旷课检讨书
2014/01/22 职场文书
预防煤气中毒方案
2014/06/16 职场文书
尼克胡哲观后感
2015/06/08 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
Python中itertools库的四个函数介绍
2022/04/06 Python