如何去除太阳镜的反光并改变太阳镜镜片的颜色

Posted

技术标签:

【中文标题】如何去除太阳镜的反光并改变太阳镜镜片的颜色【英文标题】:How to remove reflection from sunglasses and change the color of lenses in sunglasses 【发布时间】:2021-10-21 01:38:13 【问题描述】:

我正在做一个项目,我必须去除太阳镜上的反光并改变镜片的颜色。因此,我尝试检测图像中的主要颜色(太阳镜镜片),然后尝试使用 OpenCV 将该颜色替换为另一种颜色。

但是代码不能正常工作。所以,请帮助我。 这是得到的结果。

这是我用来裁剪部分图像(镜头)然后检测主色的代码。

import cv2
from google.colab.patches import cv2_imshow
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter
from skimage.color import rgb2lab, deltaE_cie76
import os

img = cv2.imread('originalimage.jpg')
cropped_lens2 = img[556:2045, 2000:3177]

image = cv2.cvtColor(cropped_lens2, cv2.COLOR_BGR2RGB)

modified_image = cv2.resize(image, (600, 400), interpolation = cv2.INTER_AREA)
cv2_imshow(modified_image)
modified_image = modified_image.reshape(modified_image.shape[0]*modified_image.shape[1], 3)
number_of_colors=2

clf = KMeans(n_clusters = number_of_colors)
labels = clf.fit_predict(modified_image)

counts = Counter(labels)

center_colors = clf.cluster_centers_
ordered_colors = [center_colors[i] for i in counts.keys()]
hex_colors = [RGB2HEX(ordered_colors[i]) for i in counts.keys()]
rgb_colors = [ordered_colors[i] for i in counts.keys()]

plt.figure(figsize = (8, 6))
plt.pie(counts.values(), labels = hex_colors, colors = hex_colors)

输入图像和输出图像如下所示。

Original image

Cropped image

color range output

我用来用单一颜色替换颜色范围的代码。 你也可以用渐变色替换它。

from PIL import Image
img = Image.open("old_Test/DSC-0296 fold.jpg")

img = img.convert("RGB")

datas = img.getdata()

new_image_data = []
for item in datas:
   if item[0] in list(range(0, 80)):
      new_image_data.append((255, 204, 100))
   else:
      new_image_data.append(item)

img.putdata(new_image_data)
img

output image after replacing colors

【问题讨论】:

看起来您的颜色范围不足以覆盖整个镜头区域,因为镜头的下部更亮。您是否尝试过使用任何图像编辑软件(Paint.Net、GIMP、Photoshop)并尝试选择镜头区域(魔棒工具)?这可能会给你同样的问题。因此,您可能需要调整阈值,或进行一些自适应阈值处理才能选择正确的区域。 我的目标是只改变镜片的颜色,我试图通过调整颜色范围来给它上色,但没有奏效。要么它会为整个太阳镜着色,要么只是它的一部分。 【参考方案1】:

使用 OpenCV 更改任何图像的颜色:

根据您的评论,也许这可以帮助您

您可以从需要更改的部分制作蒙版。

def changeColor(im, msk, hue=130):
    h, s, v = cv2.split(cv2.cvtColor(im.copy(), cv2.COLOR_BGR2HSV))
    h[np.where(msk == 0)] = hue
    return cv2.cvtColor(cv2.merge([h, s, v]), cv2.COLOR_HSV2BGR)

在这6张图片中,左上角是我用绘图软件绘制的主要图片。左下角的图像是一个掩码,它告诉算法图像应该在哪里改变。除了这两张图片,其他四张都是功能测试。

【讨论】:

以上是关于如何去除太阳镜的反光并改变太阳镜镜片的颜色的主要内容,如果未能解决你的问题,请参考以下文章

一种模块化太阳镜

求名牌太阳镜Maui jim 的详细资料

如何去除 mIRC 用户使用的颜色代码?

unity太阳光在哪?

有啥办法可以去除 AlertDialog 的背景?

姑娘姑娘,太阳太阳