基于opencvpython的颜色预测系统

基于opencvpython的颜色预测系统,python,opencv,data-science,knn,Python,Opencv,Data Science,Knn,嗨,我是一个试图制作颜色预测系统的初级开发人员,但我遇到了一些我无法理解的错误。我想你可以帮我做这个。。。。我将与您分享我的正确代码 这是错误:索引器错误:索引1超出大小为1的轴0的界限 RGB2HEX(颜色):函数中显示的错误,但我无法解决它 代码如下: def RGB2HEX(color): return "#{:02x}{:02x}{:02x}".format(int(color[0]), int(color[1]), int(color[2])) def get_i

嗨,我是一个试图制作颜色预测系统的初级开发人员,但我遇到了一些我无法理解的错误。我想你可以帮我做这个。。。。我将与您分享我的正确代码

这是错误:索引器错误:索引1超出大小为1的轴0的界限

RGB2HEX(颜色):函数中显示的错误,但我无法解决它

代码如下:

def RGB2HEX(color):
return "#{:02x}{:02x}{:02x}".format(int(color[0]), int(color[1]), int(color[2]))

def get_image(image_path):
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
return image

IMAGE_DIRECTORY = 'C:/Users/Dell/Desktop/CPS 02'
COLORS = {
    'GREEN': [0, 128, 0],
    'BLUE': [0, 0, 128],
    'YELLOW': [255, 255, 0]
}
images = []

for file in os.listdir(IMAGE_DIRECTORY):
    if not file.startswith('.'):
        images.append(get_image(os.path.join(IMAGE_DIRECTORY, file)))

# extracting colors from image 
def get_colors(images, number_of_colors, show_char = True):
for j in range(len(images)):
    modified_image = cv2.resize(images[j], (600, 400), interpolation = cv2.INTER_AREA)
    modified_image = modified_image.reshape(modified_image.shape[0]*modified_image.shape[1],1)

    clf = KMeans(n_clusters = number_of_colors)
    labels = clf.fit_predict(modified_image)

    counts = Counter(labels)

    center_colors = clf.cluster_centers_
    # We get ordered colors by iterating through the keys
    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()]

# matching an image by its color
def match_image_by_color(image, color, threshold = 60, number_of_colors = 10): 

image_colors = get_colors(image, number_of_colors, False)
selected_color = rgb2lab(np.uint8(np.asarray([[color]])))

select_image = False
for i in range(number_of_colors):
    curr_color = rgb2lab(np.uint8(np.asarray([[image_colors[i]]])))
    diff = deltaE_cie76(selected_color, curr_color)
    if (diff < threshold):
        select_image = True

return select_image

# Selecting an image
def show_selected_images(images, color, threshold, colors_to_match):
index = 1

for i in range(len(images)):
    selected = match_image_by_color(images[i], color, threshold, colors_to_match)
    if (selected):
        plt.subplot(1, 5, index)
        plt.imshow(images[i])
        index += 1

# printing the result 
plt.figure(figsize = (20, 10))
show_selected_images(images, COLORS['BLUE'], 60, 5)
def RGB2HEX(颜色):
返回“{:02x}{:02x}{:02x}”。格式(int(color[0])、int(color[1])、int(color[2]))
def获取图像(图像路径):
image=cv2.imread(图像路径)
image=cv2.cvt颜色(image,cv2.COLOR\u BGR2RGB)
返回图像
IMAGE_目录='C:/Users/Dell/Desktop/CPS 02'
颜色={
“绿色”:[0,128,0],
“蓝色”:[0,0,128],
“黄色”:[255,255,0]
}
图像=[]
对于os.listdir(IMAGE\u目录)中的文件:
如果不是file.startswith('.'):
append(get_image(os.path.join(image_目录,文件)))
#从图像中提取颜色
def get_颜色(图像、颜色数、显示字符=真):
对于范围内的j(透镜(图像)):
修改的_图像=cv2.调整大小(图像[j],(600400),插值=cv2.内部_区域)
modified_image=modified_image.重塑(modified_image.shape[0]*modified_image.shape[1],1)
clf=KMeans(n个簇=颜色数)
标签=clf.fit\u predict(修改的图像)
计数=计数器(标签)
中心颜色=clf.cluster\u中心_
#我们通过迭代键得到有序的颜色
有序颜色=[计数中i的中心颜色[i]keys()]
十六进制颜色=[RGB2HEX(有序颜色[i]),用于计数中的i。键()
rgb_颜色=[计数中i的有序_颜色[i]键()
#按颜色匹配图像
def按颜色匹配图像(图像,颜色,阈值=60,颜色数=10):
图像颜色=获取颜色(图像、颜色数量、假)
所选颜色=rgb2lab(np.uint8(np.asarray([[color]]))
选择_image=False
对于范围内的i(颜色的数量):
curr\u color=rgb2lab(np.uint8(np.asarray([[image\u colors[i]]))
差异=三角形cie76(选定颜色、当前颜色)
如果(差值<阈值):
选择_image=True
返回选择图像
#选择图像
def显示所选图像(图像、颜色、阈值、颜色匹配):
索引=1
对于范围内的i(len(图像)):
选中=按颜色匹配图像(图像[i]、颜色、阈值、颜色匹配)
如果(选中):
plt.子批次(1、5、索引)
plt.imshow(图片[i])
指数+=1
#打印结果
plt.图(figsize=(20,10))
显示所选图像(图像、颜色[‘蓝色’]、60、5)
将此作为导入指南,我成功地在我拥有的一些股票图像上实现了您的代码,并重新创建了您的错误。我想我知道发生了什么

我相信你正在阅读的图像是单通道(灰度),而不是RGB。重塑图像时,将每个图像转换为一个Nx1矢量——只有一个颜色通道。因此,当引用1D图像向量的第二维度时,
RGB2HEX()
函数会出错

当我读入一个三通道(RGB)图像,并重塑为Nx3矩阵时,您的函数成功执行。我在下面包含了完整的代码。您将注意到可以与灰度图像一起使用的两行(注释掉)来重现错误。显然,如果您想要灰度版本,请注释掉RGB等效线

从sklearn.cluster导入KMeans
将matplotlib.pyplot作为plt导入
将numpy作为np导入
进口cv2
从收款进口柜台
导入操作系统
导入argparse
def RGB2HEX(颜色):
返回“{:02x}{:02x}{:02x}”。格式(int(color[0])、int(color[1])、int(color[2]))
def获取图像(图像路径):
image=cv2.imread(图像路径)
image=cv2.cvt颜色(image,cv2.COLOR\u BGR2RGB)
#读取为灰度图像的示例
#image=cv2.imread(image\u路径,0)
返回图像
IMAGE_目录='。/path/to/images/'
颜色={
“绿色”:[0,128,0],
“蓝色”:[0,0,128],
“黄色”:[255,255,0]
}
图像=[]
对于os.listdir(IMAGE\u目录)中的文件:
如果不是file.startswith('.'):
append(get_image(os.path.join(image_目录,文件)))
#从图像中提取颜色
def get_颜色(图像、颜色数、显示字符=真):
对于范围内的j(透镜(图像)):
修改的_图像=cv2.调整大小(图像[j],(600400),插值=cv2.内部_区域)
modified_image=modified_image.重塑(modified_image.shape[0]*modified_image.shape[1],3)
#用于灰度图像的示例
#modified_image=modified_image.重塑(modified_image.shape[0]*modified_image.shape[1],1)
clf=KMeans(n个簇=颜色数)
标签=clf.fit\u predict(修改的图像)
计数=计数器(标签)
中心颜色=clf.cluster\u中心_
#我们通过迭代键得到有序的颜色
有序颜色=[计数中i的中心颜色[i]keys()]
十六进制颜色=[RGB2HEX(有序颜色[i]),用于计数中的i。键()
rgb_颜色=[计数中i的有序_颜色[i]键()

您能粘贴整个错误消息吗?另外,我建议您检查
订购颜色[I]
的大小。它可能只有一个元素,而不是你假设的三个。我用一个错误的图片编辑问题,你现在可以检查它。你看到的错误告诉你请求的索引太大了。如果它发生在RGB2HEX()函数中,则一定是由于colors变量引起的。我将调试这个函数并检查变量。很可能是一个索引,而不是您所期望的三个索引。是的,您是对的,您能将此代码更正吗?我试过了,但它仍然产生一个索引值,我需要三个索引谢谢,我成功地执行了代码,它现在正常工作了,很高兴我能提供帮助!如果这个答案解决了你的问题,请接受它。否则,让我们知道你做了什么来解决你的问题