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实现将元祖转换成数组的方法
May 04 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Python模拟三级菜单效果
Sep 11 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
取numpy数组的某几行某几列方法
Apr 03 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
使用Python计算玩彩票赢钱概率
Jun 26 Python
Django框架orM与自定义SQL语句混合事务控制操作
Jun 27 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
python使用配置文件过程详解
Dec 28 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 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 什么是PEAR?(第三篇)
2009/03/19 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
js获取url参数代码实例分享(JS操作URL)
2013/12/13 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
jquery编写日期选择器
2017/03/16 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
layUI实现前端分页和后端分页
2019/07/27 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
python实现连接mongodb的方法
2015/05/08 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
python从子线程中获得返回值的方法
2019/01/30 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
pytorch ImageFolder的覆写实例
2020/02/20 Python
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
政法学院毕业生求职信
2014/02/28 职场文书
公司捐款倡议书
2014/05/14 职场文书
副处级干部考察材料
2014/05/17 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
公司租房协议书范本
2014/10/08 职场文书
教学副校长工作总结
2015/08/13 职场文书
初中思品教学反思
2016/02/20 职场文书
Django如何创作一个简单的最小程序
2021/05/12 Python
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
Python turtle实现贪吃蛇游戏
2021/06/18 Python