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)
结果图:
转载请注明出处,欢迎讨论和交流!