转贴 :酷python 链接:https://zhuanlan.zhihu.com/p/110182171
(只是个人留存)

使用python检测图片上的色彩

面对一张色彩绚丽的图片,你很像知道某一块的颜色是什么,这包括色彩的名字和这一点上色彩的RGB值,但在缺少专业工具的情况下,这似乎是一个难以完成的任务,但python可以为我们提供这样的功能,解决pandas, cv2库,我们可以实现这样的功能,最终的效果如下图所示

鼠标双击在红色区域,图片上方则显示出这个区域的颜色信息。那么,该如何实现这样有趣的功能呢?通过本文,你将会学习到cv2库的一般使用方法,例如显示图片,处理鼠标双击事件,在图片上添加文字。

  1. 安装必要的python库
    pip install opencv-python numpy pandas
    opencv是一个强大的图像处理和计算机视觉库, pandas是一种基于numpy的工具,在数据分析方面非常受欢迎,实现图片颜色检测的功能,必须用到这三个库

  2. 通过点击获得像素信息
    程序需要将图片显示出来,鼠标双击后,程序获得鼠标点击的位置,通过这个位置,获取这个点的像素色彩信息,也就是RGB值。


import cv2img = cv2.imread('colorpic.jpg')def click_info(event, x, y, flags, param):# 只处理双击事件if event == cv2.EVENT_LBUTTONDBLCLK:print('坐标', x, y)b, g, r = img[y, x]     # 获取b, g, rprint("像素点的bgr值", b, g, r)cv2.namedWindow('image')
cv2.setMouseCallback('image',  click_info)while True:cv2.imshow("image", img)# 点击 esc键if cv2.waitKey(20) & 0xFF ==27:breakcv2.destroyAllWindows()

执行程序,双击图片上的某一点,就可以获得鼠标所点击区域的x,y值

  1. 在图片上显示文字
    为了在图片上显示文字,先使用rectangle方法绘制出一个矩形区域,需要指定矩形的左上角和右下角的x,y 值,并指定色彩,下面的示例中,色彩我选择了(0, 0, 0) 黑色。putText方法用于显示文字,指定文字开始的x, y坐标
import cv2img = cv2.imread('colorpic.jpg')
cv2.rectangle(img, (20, 20), (750, 60), (0,0,0), -1)
cv2.putText(img, 'this is a picture', (50,50), 2, 0.8, (255,255,255), 2, cv2.LINE_AA)while True:cv2.imshow("image", img)# 点击 esc键if cv2.waitKey(20) & 0xFF ==27:breakcv2.destroyAllWindows()
  1. 根据RGB值计算色彩名称
    RGB色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。前面已经讲解如何获得像素点的RGB, 那么如何通过这三个值判断它属于哪种颜色呢?

首先,需要一份颜色信息表,记录色彩的名称和RGB值,这些信息记录在一份csv文件中,格式如下

air_force_blue_raf,“Air Force Blue (Raf)”,#5d8aa8,93,138,168
air_force_blue_usaf,“Air Force Blue (Usaf)”,#00308f,0,48,143
air_superiority_blue,“Air Superiority Blue”,#72a0c1,114,160,193
第二列是色彩名称,后散列是RGB值,使用pandas将数据读取到dataframe中,获得一个像素点后,计算遍历dataframe中的所有数据,找到r, g, b差值最小的那一个就可以任务是该颜色

import pandas as pdindex = ["color", "color_name", "hex", "R", "G", "B"]
csv_df = pd.read_csv('colors.csv', names=index, header=None)def get_color_name(r, g, b):min_diff = 10000color_name = ''for i in range(len(csv_df)):d = abs(r- int(csv_df.loc[i,"R"])) + abs(g- int(csv_df.loc[i,"G"]))+ abs(b- int(csv_df.loc[i,"B"]))if d <= min_diff:min_diff = dcolor_name = csv_df.loc[i,"color_name"]return color_name
函数get_color_name根据r, g, b的值来确定色彩名称

5.全部代码

import pandas as pd
import cv2def get_color_name(r, g, b):min_diff = 10000color_name = ''for i in range(len(csv_df)):d = abs(r - int(csv_df.loc[i, "R"])) + abs(g - int(csv_df.loc[i, "G"]))+ abs(b - int(csv_df.loc[i, "B"]))if d <= min_diff:min_diff = dcolor_name = csv_df.loc[i,"color_name"]return color_namedef click_info(event, x, y, flags, param):# 只处理双击事件if event == cv2.EVENT_LBUTTONDBLCLK:global b,g,r,xpos,ypos, clickedxpos = xypos = yb, g, r = img[y, x]     # 获取b, g, rb = int(b)g = int(g)r = int(r)clicked = Truer = g = b = xpos = ypos = 0
clicked = False
img = cv2.imread('colorpic.jpg')
index = ["color", "color_name", "hex", "R", "G", "B"]
csv_df = pd.read_csv('colors.csv', names=index, header=None)cv2.namedWindow('image')
cv2.setMouseCallback('image',  click_info)while True:cv2.imshow("image", img)if clicked:# 绘制显示文字的区域cv2.rectangle(img, (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(img, text, (50, 50), 2, 0.8, (255, 255, 255), 2, cv2.LINE_AA)# 如果像素点的颜色太偏向于白色,就用黑色来显示文字if(r + g + b >= 600):cv2.putText(img, text, (50, 50), 2, 0.8, (0, 0, 0), 2, cv2.LINE_AA)clicked=False# 点击 esc键if cv2.waitKey(20) & 0xFF ==27:breakcv2.destroyAllWindows()
  1. 获取源码及数据
    想要获取程序所用图片及colors.csv文件,扫描关注微信公众号并回复 色彩 ,即可获得图片与文件,包括源码

使用python检测图片上的色彩相关推荐

  1. python保存图像的色彩_使用python检测图片上的色彩

    使用python检测图片上的色彩 面对一张色彩绚丽的图片,你很像知道某一块的颜色是什么,这包括色彩的名字和这一点上色彩的RGB值,但在缺少专业工具的情况下,这似乎是一个难以完成的任务,但python可 ...

  2. python图片识别是否p过_用 Python 和 OpenCV 检测图片上的条形码

    用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题, ...

  3. matlab检测图片马赛克,python 检测图片是否有马赛克

    原理讲的很清晰,给原博主一个赞 边缘检测之后按照正方形检索来判定是否是马赛克内容 原理知晓了之后就很好做了 话说MATLAB转化为python的过程还是很有趣的 from PIL import Ima ...

  4. python在图片上画矩形

    python在图片上画矩形 1 image_path = '' 2 image = cv2.imread(image_path) 3 first_point = (100, 100) 4 last_p ...

  5. chatgpt赋能python:Python去除图片上的文字:技术与应用

    Python去除图片上的文字:技术与应用 随着互联网的发展,图片的使用越来越广泛.然而,有些图片上却存在着不必要的文字,影响了用户的阅读体验和SEO效果.在这种情况下,Python可以帮助我们快速.准 ...

  6. 使用Python和OpenCV检测图片上的条形码

    这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需 ...

  7. 如何用Python在图片上绘制BoundingBox

    参考资料: https://blog.csdn.net/weixin_41735859/article/details/106599903 在目标检测等CV领域的任务里,经常会涉及到在图片上绘制BBo ...

  8. python检测图片相同部分_用 Python 实现哈希算法检测重复图片

    在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...

  9. python代码图片-python实现图片上添加图片

    在介绍完给图上添加文字后,我们再介绍给图片上添加图片,也就是图片的叠加. 需要使用的Python的图像库:PIL.更加详细的知识点如下: Imaga模块:用来创建,打开,保存图片文件 new(path ...

最新文章

  1. CentOS7.5安装配置PostgreSQL10
  2. python爬虫如何从一个页面进入另一个页面-Python爬虫 (一):爬取一个简单的静态网页...
  3. python矩阵运算_Python矩阵常见运算操作实例总结
  4. 【问链-EOS公开课】第十四课 EOS从单签名到多签名
  5. 客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...
  6. 6-4 单链表插入排序 (15分)
  7. gitHub上传项目
  8. python 西门子wincc_西门子SIMATIC Manager和SIMATIC WinCC Explorer万能授权
  9. C#中ListView分页操作
  10. plot、plot,semilogx(x,y),semilogy(x,y),loglog(x,y), bar(x):hist(x): fplot
  11. C++求一元二次方程根
  12. Android软件开发用什么语言?
  13. 基于51单片机智能温控风扇设计PWM调速套件电子制作仿真
  14. “奈雪们”的瓶装茶饮,是门好生意吗?
  15. 主成分有什么用?如何进行呢?
  16. 【JZOJ 5405】【NOIP2017提高A组模拟10.10】Permutation
  17. 信号与系统——初识到理解(第二章——信号与系统)
  18. sqlserver AlwaysOn实现读写分离配置及java/net代码实现
  19. python 正则表达函数_python笔记-正则表达式常用函数
  20. Windows认证体系解读

热门文章

  1. 用matlab实现共轭梯度法求解实例,用MATLAB实现共轭梯度法求解实例
  2. 安装 OpenVPN 客户端
  3. 32位进程注入64位进程
  4. 什么是区块链?区块链相关知识区入门
  5. 【单片机】汇编指令英文全称
  6. 我的世界服务器修改武器合成表,我的世界武器合成表大全 我的世界武器怎么合成...
  7. 在access中记录的末尾标志是什么_Access复习题(含答案)
  8. 牛客多校-Z-Game on grid-(博弈论+必胜态必败态转移)
  9. 一分钟看懂“设备数据采集”神器
  10. qq空间h5页面,如何在微信中直接打开qq空间链接却不需要登陆qq账号密码