【发布时间】: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)
输入图像和输出图像如下所示。
我用来用单一颜色替换颜色范围的代码。 你也可以用渐变色替换它。
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
【问题讨论】:
-
看起来您的颜色范围不足以覆盖整个镜头区域,因为镜头的下部更亮。您是否尝试过使用任何图像编辑软件(Paint.Net、GIMP、Photoshop)并尝试选择镜头区域(魔棒工具)?这可能会给你同样的问题。因此,您可能需要调整阈值,或进行一些自适应阈值处理才能选择正确的区域。
-
我的目标是只改变镜片的颜色,我试图通过调整颜色范围来给它上色,但没有奏效。要么它会为整个太阳镜着色,要么只是它的一部分。
标签: python opencv image-processing colors google-colaboratory