Python高效统计RGB图片像素个数:双通道对比与OpenCV实现

码头散步
码头散步
发布时间:2026-10-14 | 4人浏览过
原创

本文介绍在Python中高效统计RGB图片特定像素个数的两种方法。首先分析直接遍历RGB三通道效率低下的问题,提出利用灰度转换结合Numpy广播机制进行快速统计的方案,需预先已知灰度值与RGB颜色的对应关系。随后展示使用OpenCV进行图像像素分布统计的完整代码,包括灰度转换、直方图绘制及结果可视化,适用于需要高性能图像处理的场景。

处理RGB三通道图像时,若直接使用双重for循环遍历每个像素点,计算效率往往较低。

一种优化策略是先将RGB图像转换为灰度图像,随后利用Numpy的广播机制来统计像素个数。需要注意的是,该方法的前提是必须预先掌握灰度像素值与原始RGB颜色之间的对应关系。

具体实现代码如下:


from PIL import Image
import numpy as np
import cv2

img_L = np.array(Image.open('test.png').convert("L"))
img_RGB = np.array(Image.open('test.png').convert("RGB"))

# temp = {}
# for i in range(img_L.shape[0]):
#   for j in range(img_L.shape[1]):
#     if not temp.get(int(img_L[i][j])):
#       temp[int(img_L[i][j])] = list(img_RGB[i][j])
# print(temp)

#这里得到灰度像素值0对应(0,0,0),62对应(19,69,139)
color_0_0_0 = np.where(img_L == 0)[0].shape[0]
color_19_69_139 = np.where(img_L == 62)[0].shape[0]

pixel_sum = img_L.shape[0] * img_L.shape[1]

print("0_0_0 像素个数:{} 占比:%{}".format(color_0_0_0,color_0_0_0/pixel_sum*100))
print("19_69_139 像素个数:{} 占比:%{}".format(color_19_69_139,color_19_69_139/pixel_sum*100))

补充知识:OpenCV中如何统计图像的像素分布值个数(第6部分)

具体代码如下:


import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def statistics():
  src = cv.imread("D:/matplotlib/0.jpg")
  cv.imshow("q",src)
  h,w,ch = np.shape(src)
  gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
  cv.imshow("gray",gray)
  hest = np.zeros([256],dtype = np.int32)
  for row in range(h):
    for col in range(w):
      pv = gray[row,col]
      hest[pv] +=1
  plt.plot(hest,color = "r")
  plt.xlim([0,256])
  plt.show()
  cv.waitKey(0)
  cv.destroyAllWindows()
statistics()

程序运行效果如下:

生成像素分布统计图表。

代码详细解释如下:


import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def statistics():
  src = cv.imread("D:/matplotlib/0.jpg")
  cv.imshow("q",src)
  h,w,ch = np.shape(src)
  #读取图像属性
  gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
  #将图像转换成灰度图,
  cv.imshow("gray",gray)
  hest = np.zeros([256],dtype = np.int32)
  #建立空白数组
  for row in range(h):
    for col in range(w):
      pv = gray[row,col]
      hest[pv] +=1
      #统计不同像素值出现的频率
  plt.plot(hest,color = "r")
  plt.xlim([0,256])
  plt.show()
  #画出统计图
  cv.waitKey(0)
  cv.destroyAllWindows()
statistics()

以上内容为个人经验分享,旨在提供参考。欢迎大家提出批评指正,如有疏漏之处,敬请谅解。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表