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的socket编程入门教程
Apr 23 Python
详解Python多线程
Nov 14 Python
python中安装模块包版本冲突问题的解决
May 02 Python
回调函数的意义以及python实现实例
Jun 20 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
python抖音表白程序源代码
Apr 07 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 Python
使用pyqt 实现重复打开多个相同界面
Dec 13 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
在keras里实现自定义上采样层
Jun 28 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 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
第五节--克隆
2006/11/16 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
jQuery实现商品活动倒计时
2015/10/16 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
jquery 手势密码插件
2017/03/17 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
Python中super关键字用法实例分析
2015/05/28 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python排序搜索基本算法之冒泡排序实例分析
2017/12/09 Python
python构建深度神经网络(DNN)
2018/03/10 Python
python try except 捕获所有异常的实例
2018/10/18 Python
浅谈Python 递归算法指归
2019/08/22 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
HTML5标签小集
2011/08/02 HTML / CSS
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
Linux的主要特性
2014/10/06 面试题
校园网站的创业计划书范文
2013/12/30 职场文书
伦敦奥运会的口号
2014/06/21 职场文书
营销总经理岗位职责范本
2014/09/02 职场文书
工作能力自我评价2015
2015/03/05 职场文书
幽灵公主观后感
2015/06/09 职场文书
退休教师追悼词
2015/06/23 职场文书
python编写五子棋游戏
2021/05/25 Python
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis