Python-返回图像上某个特定像素的RGB/颜色识别器
返回特定像素的RGB值
import cv2
import numpy as np
img = cv2.imread('color_image.jpg')
px = img[10, 50]
print(px)
blue = img[10, 50, 0]
print(blue)
green = img[10, 50, 1]
print(green)
red = img[10, 50, 2]
print(red)

基于Python的颜色识别器
import numpy as np
import pandas as pd
import cv2
img =cv2.imread('color_image.jpg')
index=['color','color_name','hex','R','G','B']
csv=pd.read_csv('colors.csv',names=index,header=None)
#指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉
#names : array-like, default None 用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True
clicked=False #初始化
r=g=b=xpos=ypos=0 #初始化
def recognize_color(R,G,B):
minimum = 10000
for i in range(len(csv)):
d = abs(R- int(csv.loc[i,"R"])) + abs(G- int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))
if(d<=minimum):
minimum = d
cname = csv.loc[i,"color_name"]
return cname
def mouse_click(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
global b,g,r,xpos,ypos, clicked
clicked = True
xpos = x
ypos = y
b,g,r = img[y,x]
b = int(b)
g = int(g)
r = int(r)
cv2.namedWindow('Color Recognition App')#创建一个窗口
cv2.setMouseCallback('Color Recognition App',mouse_click)#调用鼠标双击功能
while (1):
cv2.imshow("Color Recognition App", img)
if (clicked):
# cv2.rectangle(image, startpoint, endpoint, color, thickness)-1 fills entire rectangle
cv2.rectangle(img, (20, 20), (750, 60), (b, g, r), -1) # (x1, y1), (x2, y2) -1代表颜色填充满整个矩形
# Creating text string to display( Color name and RGB values )
text = recognize_color(r, g, b) + ' R=' + str(r) + ' G=' + str(g) + ' B=' + str(b)
# cv2.putText(img,text,start,font(0-7),fontScale,color,thickness,lineType )
cv2.putText(img, text, (50, 50), 2, 0.8, (255, 255, 255), 2, cv2.LINE_AA)
#图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
# For very light colours we will display text in black colour
if (r + g + b >= 600):
cv2.putText(img, text, (50, 50), 2, 0.8, (0, 0, 0), 2, cv2.LINE_AA)
clicked = False
#Break the loop when user hits 'esc' key
if cv2.waitKey(20) & 0xFF ==27:
break
cv2.destroyAllWindows()
测试图:
教授色彩
首先,我们必须教给他们什么是颜色。为此,我们需要包含颜色名称和一些与这些颜色匹配的值的数据。由于大多数颜色都可以使用红色,绿色和蓝色定义。这就是为什么我们将RGB格式用作数据点的原因。我找到了一个准备就绪的csv文件,其中包含大约1000个颜色名称和RGB值。下面是相关链接:
https://github.com/codebrainz/color-names/blob/master/output/colors.csv
将在程序中使用此csv文件。该文件的屏幕截图可让您有所了解:

让我们使用read_csv方法将colors.csv文件导入到我们的程序中。由于我们下载的csv文件没有列名,因此我将在程序中定义它们。此过程称为数据处理。
index=['color','color_name','hex','R','G','B']
csv=pd.read_csv('colors.csv',names=index,header=None)
#指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉
#names : array-like, default None 用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True
全局变量
在以下步骤中,我们将定义两个函数。为了使应用程序顺利运行,我们需要一些全局变量。大家将了解全局变量在使用函数时是如何帮助大家的。
clicked = False r = g = b = xpos = ypos = 0
颜色识别功能
当我们双击图像的某个区域时,将调用此函数。它将返回颜色名称和该颜色的RGB值。这就是神奇的地方!
def recognize_color(R,G,B):
minimum = 10000
for i in range(len(csv)):
d = abs(R- int(csv.loc[i,"R"])) + abs(G- int(csv.loc[i,"G"]))+ abs(B- int(csv.loc[i,"B"]))
if(d<=minimum):
minimum = d
cname = csv.loc[i,"color_name"]
return cname
鼠标点击功能
此函数用于定义我们的双击过程。在创建应用程序部分时,我们将需要它。
def mouse_click(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
global b,g,r,xpos,ypos, clicked
clicked = True
xpos = x
ypos = y
b,g,r = img[y,x]
b = int(b)
g = int(g)
r = int(r)
结果图:

转载请注明出处,欢迎讨论和交流!

浙公网安备 33010602011771号