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)

结果图:

 

posted @ 2021-03-21 15:05  司砚章  阅读(2251)  评论(0编辑  收藏  举报