使用OpenCV自动去除背景色

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达16a6586083b56b72b35436c4fd17d00f.png

几天前,我遇到了一个项目,要求将草图放到某个文件夹中时删除草图的白色背景。这都是在硬件扫描仪中发生的。

下面是一个草图示例:

3dbb68848f2b7c9afdd0ea2454013c93.png

第一步是安装此项目的依赖关系,具体需要内容我们将在下面列出。此外,我们还将使用Python 3.7。

opencv_python==4.1.0.25
pip install opencv-python
numpy==1.16.4
pip install numpy

之后,我们将导入项目所需的所有模块

import cv2
import os
import string
import random
from os import listdir
from os.path import isfile, join, splitext
import time
import sys
import numpy as np
import argparse

然后,我们创建三个不同的变量:要处理的文件夹的名称,图像在处理后存储的文件夹的名称,以及在监视文件夹时的轮询时间(即,它检查文件夹中更改的频率,在我们这里设置的是一秒钟)

watch_folder = ‘toprocess’
processed_folder = ‘processed’
poll_time = 1

文件夹“ toprocess”和“ processed”放置在和我们的python脚本的同一目录中。

然后,我们将介绍我们程序主要功能的代码,它将监视我们的“ toprocess”目录,如果没有发生任何更改,程序将处理存入在该文件夹的所有图像。

before = dict([(f, None) for f in os.listdir(watch_folder)])
while 1:
  time.sleep(poll_time)
  after = dict([(f, None) for f in os.listdir(watch_folder)])
  added = [f for f in after if not f in before]
  removed = [f for f in before if not f in after]
if added:
    print(“Added “, “, “.join(added))
if added[0] is not None:
    processImage(added[0])
if removed:
    print(“Removed “, “, “.join(removed))
  before = after

这段代码将无限循环运行,直到脚本被杀死为止。启动后,它将文件存储在名为“ before”的词典目录中。接下来,下面将分解介绍无限循环中的步骤:

  • 睡眠指定的poll_time(1秒)。

  • 将文件信息存储在名为after的字典目录中。

  • 通过比较之后的IN和之前的NOT来存储已添加的内容

  • 检查最后添加的元素(added [0])(如果存在),然后调用一个函数,我们将在文件上稍作介绍的processImage进行讨论。

  • 如果已删除,请通过打印一些信息来让用户知道。

  • 最后,将目录中的最新文件进行更新。

接下来介绍processImage函数,这是程序的核心。这就是OpenCV后台删除魔术发生的地方。下面的注释解释了该代码(需要基本的OpenCV知识):

def processImage(fileName):
# Load in the image using the typical imread function using our watch_folder path, and the fileName passed in, then set the final output image to our current image for now
  image = cv2.imread(watch_folder + ‘/’ + fileName)
  output = image
# Set thresholds. Here, we are using the Hue, Saturation, Value color space model. We will be using these values to decide what values to show in the ranges using a minimum and maximum value. 
THESE VALUES CAN BE PLAYED AROUND FOR DIFFERENT COLORS
  hMin = 29  # Hue minimum
  sMin = 30  # Saturation minimum
  vMin = 0   # Value minimum (Also referred to as brightness)
  hMax = 179 # Hue maximum
  sMax = 255 # Saturation maximum
  vMax = 255 # Value maximum
# Set the minimum and max HSV values to display in the output image using numpys' array function. We need the numpy array since OpenCVs' inRange function will use those.
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Create HSV Image and threshold it into the proper range.
  hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # Converting color space from BGR to HSV
mask = cv2.inRange(hsv, lower, upper) # Create a mask based on the lower and upper range, using the new HSV image
# Create the output image, using the mask created above. This will perform the removal of all unneeded colors, but will keep a black background.
output = cv2.bitwise_and(image, image, mask=mask)
# Add an alpha channel, and update the output image variable
  *_, alpha = cv2.split(output)
  dst = cv2.merge((output, alpha))
output = dst
# Resize the image to 512, 512 (This can be put into a variable for more flexibility), and update the output image variable.
  dim = (512, 512)
output = cv2.resize(output, dim)
# Generate a random file name using a mini helper function called randomString to write the image data to, and then save it in the processed_folder path, using the generated filename.
  file_name = randomString(5) + ‘.png’
  cv2.imwrite(processed_folder + ‘/’ + file_name, output)

接下来是一个非常简单的功能,可以正确地完成工作。再次强调,使用阈值可以提供更好的结果。我们需要讨论的最后一件事是mini helper函数,该函数为文件名生成随机字符串。

def randomString(length):
  letters = string.ascii_lowercase
return ‘’.join(random.choice(letters) for i in range(length))

这是一个简单的功能。它使用“string”库获取字母,然后根据我们传入的长度加入随机选择的字符。传入5的长度将生成5个字符的字符串。

整个程序的处理结果如下所示:

fbd6d2ff396edfbc29ada35edaf7c0a6.png

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~dd5d13cf7a8175882f910f17a4ec5bbf.png

049b6c0de58cc1c77f5d504c18b88a35.png

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用Qt和OpenCV实现基于颜色的物体区分时,可以按照以下步骤进行操作: 1. 导入Qt和OpenCV的相关库和头文件。 2. 打开摄像头或者读取视频为输入源。 3. 读取每一帧图像。 4. 将图像从BGR色彩空间转换为HSV色彩空间,由于HSV色彩空间更适合进行颜色分析。 5. 设定目标物体的颜色范围,使用inRange函数进行颜色分割,得到目标物体的二值图像。 6. 对二值图像进行形态学操作,如腐蚀和膨胀,以消除噪声和填充目标物体内部空洞。 7. 使用findContours函数找到目标物体的轮廓。 8. 根据轮廓的特征,如面积、周长、外接矩形等,对目标物体进行筛选,去除不符合条件的轮廓。 9. 在原始图像上绘制出符合条件的目标物体轮廓。 10. 可以选择添加其他附加功能,如标记目标物体的中心点、显示物体跟踪trajectory等。 11. 循环执行步骤3至步骤10,实现实时的基于颜色的物体区分。 12. 释放摄像头或关闭视频文件。 13. 结束程序运行。 通过以上步骤,可以利用Qt和OpenCV实现基于颜色的物体区分,通过对目标物体颜色的提取和轮廓分析,实现对不同颜色物体的识别和分割。 ### 回答2: Qt是一种跨平台的应用程序框架,而OpenCV是一个功能强大的开源计算机视觉库。结合Qt和OpenCV,我们可以实现基于颜色的物体区分。 首先,要使用Qt和OpenCV,在Qt项目中包括OpenCV库并链接到项目中。接下来,我们需要通过Qt提供的界面来获取图像。可以使用Qt的QCamera类来连接到摄像头并捕获实时图像,或者使用Qt的QFileDialog类来选择所需的图像文件。 一旦我们获得了图像,我们就可以使用OpenCV的函数进行图像处理和分析。对于基于颜色的物体区分,首先需要将图像从RGB颜色空间转换为HSV颜色空间。在HSV颜色空间中,我们可以更容易地对颜色进行分析。 然后,我们可以根据所需颜色的HSV范围来创建一个掩码。掩码是一个二进制图像,其中白色像素表示在指定颜色范围内的像素,而黑色像素表示不在范围内的像素。我们可以使用OpenCV的inRange函数创建此掩码。 接下来,我们可以使用掩码将原始图像中的物体分割出来。可以使用OpenCV的bitwise_and函数将原始图像与掩码进行按位与操作,从而只保留掩码中的白色区域。 最后,我们可以在Qt界面中显示分割出的物体。可以使用Qt的QPixmap类将OpenCV的Mat对象转换为Qt的QImage对象并显示在Qt的窗口上。 总结起来,使用Qt和OpenCV实现基于颜色的物体区分将涉及连接到摄像头或选择图像文件,将图像从RGB转换为HSV颜色空间,创建颜色范围掩码,使用掩码分割图像和在Qt界面中显示结果。 ### 回答3: Qt与OpenCV结合可以实现基于颜色的物体区分。首先,我们需要使用Qt框架实现图像的读取和显示功能。通过Qt的图片处理类,我们可以方便地读取和显示图片。 然后,我们集成OpenCV库,通过Qt的信号和槽机制与OpenCV库进行交互。使用OpenCV库的颜色空间转换函数,我们可以将图片转换为HSV色彩空间。HSV色彩空间相对于RGB色彩空间更适合颜色分析。 接下来,我们可以使用OpenCV库的阈值函数来分割图像中的不同颜色区域。通过设置合适的阈值,我们可以将目标物体的颜色从背景中区分出来。之后,我们可以通过OpenCV库的形态学操作对图像进行进一步处理,如腐蚀和膨胀,以消除噪声和填充空洞。 最后,使用Qt的绘图功能,我们可以在原始图像上绘制标记框或者轮廓,以展示区分出的目标物体。同时,可以利用Qt的界面设计功能,添加一些按钮和滑动条等控件,以便用户可以交互式地调整参数,实时观察效果。 总之,通过Qt的图像处理和OpenCV的颜色分割技术,我们可以实现基于颜色的物体区分。这样的系统可以应用于许多领域,如机器人视觉、工业自动化等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值