用OpenCV打造一个颜色提取器!附源码
点击下方“AI算法与图像处理”,一起进步!
重磅干货,第一时间送达
import cv2
import pandas as pd
import matplotlib.pyplot as plt
cv2:这个库是用来执行所有的计算机视觉操作——基本上是所有需要的图像处理操作。 pandas:在处理机器学习问题时,Pandas 通常有很多范围,但在本主题中,它们仅用于读取 CSV 文件并从中提取一些信息。 matplotlib: Matplotlib 与可视化数据有很大关系,尽管在这里它将用于绘制图像。
image_location = 'colorpic.jpg'
test = cv2.imread(image_location)
plt.imshow(test)
plt.show()
首先,我们在变量中保存图像的路径,使用图像的名称,而不是确切的路径,因为它与我们的 Jupyter Notebook位于同一路径中。 现在借助cv2 的 read() 函数,我们将读取 NumPy 数组格式的图像并将其存储在测试变量中。如果我们只打印出测试变量,那么它只会以数组格式显示图像。 现在我们将使用 Matplotlib 的 show() 函数来查看我们读取的图像。
flag_variable = False
red_channel = g_channel = b_channel = x_coordinate = y_coordinate = 0
在这里,首先我们取了一个标志变量,它将指示我们是否单击了图像,可以看到默认值为 false 即未单击图片,而 True 值表示已单击图片。 然后有红色、绿色和蓝色通道(RGB)以及 X 和 Y 坐标,现在设置为 0,但只要我们在图像周围移动并从中选择颜色,这些值就会改变.
heading = ["Color", "Name of color", "Hexadecimal code", "Red channel", "Green channel", "Blue channel"]
color_csv = pd.read_csv('colors.csv', names=heading, header=None)
我们正在设置彩色 CSV 文件将具有的标题名称。 然后我们将在 read_csv 函数的帮助下读取 color.csv 文件。
注意:此颜色 CSV 文件具有颜色的名称、十六进制代码、RGB 值,我们将仅比较此 CSV 文件中的值。
def get_color_name(Red, Green, Blue):
minimum = 10000
for i in range(len(color_csv)):
distance = abs(Red - int(color_csv.loc[i, "Red channel"])) + abs(Green - int(color_csv.loc[i, "Green channel"])) + abs(Blue - int(color_csv.loc[i, "Blue channel"]))
if distance <= minimum:
minimum = distance
color_name = color_csv.loc[i, "Name of color"]
return color_name
因此,首先我们将阈值设置为 10000,即实际颜色代码与我们从图像中选择颜色时得到的颜色代码之间的最小阈值距离。 然后我们计算了颜色代码与图像的距离。 现在我们将看到我们计算的距离应该小于或等于阈值距离。 最后,我们将从CSV 文件中存储颜色的名称并返回它。
def draw_function(event, x_coordinate, y_coordinate, flags, parameters):
if event == cv2.EVENT_LBUTTONDBLCLK:
global b, g, r, x_position, y_position, flag_variable
flag_variable = True
x_position = x_coordinate
y_position = y_coordinate
b, g, r = test[y_coordinate, x_coordinate]
b = int(b)
g = int(g)
r = int(r)
首先,我们将检查用户是否双击,我们将使用cv2 中的 EVENT_LBUTTONDBLCLK。 然后我们将flag_variable 设置为 True,因为现在单击了按钮。 然后是函数的主要部分,我们将在全局变量中存储坐标值及其对应的 RGB 值。 最后,我们将使用 int() 将值转换为整数类型。
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_function)
while True:
cv2.imshow("image", test)
if flag_variable:
cv2.rectangle(test, (20, 20), (750, 60), (b, g, r), -1)
text = get_color_name(r, g, b) + ' R=' + str(r) + ' G=' + str(g) + ' B=' + str(b)
cv2.putText(test, text, (50, 50), 2, 0.8, (255, 255, 255), 2, cv2.LINE_AA)
if r + g + b >= 600:
cv2.putText(test, text, (50, 50), 2, 0.8, (0, 0, 0), 2, cv2.LINE_AA)
flag_variable = False
if cv2.waitKey(20) & 0xFF == 27:
break
cv2.destroyAllWindows()
在主逻辑中,首先我们将创建一个矩形(填充:-1 用于填充矩形),我们将在其上放置我们的文本。 现在我们将获得文本字符串,其颜色代码为 RGB。 然后在 put text 方法的帮助下,我们将在之前绘制的矩形上方显示文本。 如果颜色为浅色,我们会验证,然后我们将以黑色显示文本字符串。 最后,我们可以选择使用 esc 键退出应用程序。
总结
首先,我们已经导入了所有的库。 然后我们加载并绘制选定的图像。 然后我们为我们的彩色 CSV 文件提供了标题。 我们还创建了获取颜色名称函数和绘制函数,以在用户双击任何颜色时查看图像上的结果。 然后应用程序循环执行所有步骤。
尾注
交流群
欢迎加入公众号读者群一起和同行交流,目前有美颜、三维视觉、计算摄影、检测、分割、识别、NeRF、GAN、算法竞赛等微信群
个人微信(如果没有备注不拉群!) 请注明:地区+学校/企业+研究方向+昵称
下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:终身受益的编程指南:Google编程风格指南
在「AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!
下载3 CVPR2021 在「AI算法与图像处理」公众号后台回复:CVPR,即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文
评论