将一张图片中的某个颜色去除,现在主流的做法就是通过建立一个
HSV空间范围φ
,在该范围内建立一个掩膜
mask
,与原始图像进行对比,只要原始图像像素点范围满足该HSV空间范围的,则直接用白色
rgb(255,255,255)
来替代。
这里有个问题是,如何确定整个
HSV空间范围φ
,你可以自己直接赋值(能准确肉眼给出来的,都是神仙),一般人应该还是会通过某种“连续调节装置”首先来确定HSV取值范围,然后再进一步去做去除、替代操作。
import cv2
import numpy as np
import time
def color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv):
img = cv2.imread(input_path, 1)
img_background = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
roi = hsv_img[ymin:ymax, xmin:xmax]
mask = cv2.inRange(roi, low_hsv, high_hsv)
red = cv2.bitwise_and(roi, roi, mask=mask)
bgr_red = cv2.cvtColor(red, cv2.COLOR_HSV2BGR)
img_result = img_background
img_result[ymin:ymax, xmin:xmax] = bgr_red
cv2.imwrite(output_path, img_result)
img2 = cv2.resize(img, (800, 600), interpolation=cv2.INTER_AREA)
img_cut = img[ymin:ymax, xmin:xmax]
img_cut[mask > 0] = (255, 255, 255)
img[ymin:ymax, xmin:xmax] = img_cut
cv2.imwrite(output_path, img)
cv2.imshow('result', img)
def nothing(x):
def test_color_hsv_values(input_path):
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print(hsv_blue)
cv2.createTrackbar('Hue min', 'image', 10, 179, nothing)
cv2.createTrackbar('Hue max', 'image', 10, 179, nothing)
cv2.createTrackbar('sat min', 'image', 10, 255, nothing)
cv2.createTrackbar('sat max', 'image', 10, 255, nothing)
cv2.createTrackbar('val min', 'image', 10, 255, nothing)
cv2.createTrackbar('val max', 'image', 10, 255, nothing)
img = cv2.imread(input_path)
while True:
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h_min = cv2.getTrackbarPos('Hue min', 'image')
h_max = cv2.getTrackbarPos('Hue max', 'image')
s_min = cv2.getTrackbarPos('sat min', 'image')
s_max = cv2.getTrackbarPos('sat max', 'image')
v_min = cv2.getTrackbarPos('val min', 'image')
v_max = cv2.getTrackbarPos('val max', 'image')
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
mask = cv2.inRange(hsv, lower, upper)
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('img', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
k = cv2.waitKey(5)
if k == 27:
break
cv2.destroyAllWindows()
if __name__ == '__main__':
input_path = '4.jpg'
output_path = '4_result.jpg'
ymin, ymax, xmin, xmax = 200, 800, 700, 1200
low_hsv = np.array([28, 52, 178])
high_hsv = np.array([92, 255, 255])
color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv)
这里有个test_color_hsv_values(input_path)
函数,其作用就在于修改输入的范围,实时动态观察图像颜色变化情况。
下面两张是演示效果,上面为提取“飞机”本身的图形,下面为提取“天空”的图形,通过移动Hue、Sat、Val
三组共六个进度条,确定三种变量的上下值,从而确定要选择的HSV范围。
通过test_color_hsv_values(input_path)
函数,确定了HSV数值后,重新调用 color_cut(input_path, output_path, ymin, ymax, xmin, xmax, low_hsv, high_hsv)
函数,生成result
图片。
本文是利用Opencv-python 进行的对图片颜色进行提取、抠图的一个脚本。
在 OpenCV 中,有多种方法可以实现图像去色化,其中最常用的算法之一是使用灰度转换公式将 RGB 值转换为灰度值。需要注意的是,上述示例代码仅仅是图像去色化的基本实现方式,实际应用中可能需要更复杂的算法和处理步骤。同时,还可以探索其他图像去色化的方法和技术,例如基于机器学习的方法或者基于颜色空间的方法。函数将灰度图像转换为黑白图像,其中大于阈值的像素值设为白色,小于阈值的像素值设为黑色。通过运行上述代码,我们可以将彩色图像转换为黑白图像,实现图像去色化的效果。函数显示灰度图像,并通过。
IMAGE_PATHS = ["green1.jpg", "green2.jpg", "green3.jpg"]
lower_green = np.array([35, 43, 46])
upper_green = np.array([77, 255, 255])
# lower_blue = np.array([78, 43, 46])
# upper_blue = np.array([110, 255, 255])
if __name__
opencv去除图片中某一颜色(python实现)
一 打开图片
打开图片的时候最好使用windows自带的“画图”软件查看(在画图软件下通过句柄精灵获得点的RGB值与opencv中获得的是一样的),在“画图”的左下角可以看到图像中某个点的坐标值如(344,123),如果要在opencv中处理该点的话,需要把坐标值反一下即 img[123, 344]才能取得该点
二 使用句柄精灵等软件获得想要改变的颜色的RGB值
需要注意的是opencv中的R与B通道是反着的(后面代码中有相应说明)
HSV 模型在对指定颜色分割时非常有效。用 H 和 S 分量表示颜色距离,颜色距离指代表两种颜色之间的数值差异。对于不同的彩色区域,混合 H 与 S 变量,划定阈值,就可以进行简单的分割。
函数 inRange () 可以实现按颜色区域 [lowerb,upperb] 对图像进行二值分割 。
............
我们往往需要在图像中抠出指定颜色的区域。在实际工况下这种指定颜色不是简单的纯色,往往难以单一的用R G B的某个范围值去确定。本文以PhotoShop为基准,在一副彩色图中按照提取指定范围内的HSV色彩空间。主要流程分为2步: 在PS中确定HSV的各自的范围--->转换值域后使用OpenCV提取颜色区域。......