鱼C论坛

 找回密码
 立即注册
查看: 1150|回复: 7

[已解决]计算指定像素个数之比并投入百分比判断

[复制链接]
发表于 2023-4-12 10:35:38 | 显示全部楼层 |阅读模式
10鱼币
使用python写一个相关的代码

求助各位大佬帮小弟这个忙 ,要求如下:
1.输入一张图片,自动识别其中除黑色(0,0,0)(RGB值)外其他颜色的RGB值;

2.计算其他颜色的像素个数并进行比较;

3.将比较后的数据投入判断循环:
   若0<a<=0.1,输出为0,
   若0.1<a<=0.2,输出为1,
   若0.2<a<=0.5,输出为2,
   若0.5<a<=1,输出为3。
注:a为比值

实际上主要是前两点,个人理解识别颜色RGB值的包应该调用opencv,numpy等,但具体代码因本人水平有限,需要大佬提供参考一下 ,不胜感激!

附示例图:
00d8f10f-5038-4e0f-bb58-0b885ddc0cc5___RS_Early.B 8722_pseudo.png
如上图,计算橙色(170,85,0)像素数量占橙色和绿色(0,85,0)总像素数的比值,黑色属于背景,不计入其中;随后投入一个判断循环,判断比值属于哪个级别。
最佳答案
2023-4-12 10:35:39
本帖最后由 isdkz 于 2023-4-12 16:21 编辑
黎明丿晓小 发表于 2023-4-12 16:06
请修改代码并加入以下要求:
1.将每张图片的输出结果以白色文本形式呈现在相应图片的左下角


以下是修改后的代码,将每张图片的输出结果以白色文本形式呈现在相应图片的左下角:

  1. import cv2
  2. import numpy as np
  3. import os

  4. def count_pixels(img, color_lower, color_upper):
  5.     mask = cv2.inRange(img, color_lower, color_upper)
  6.     return np.sum(mask == 255)

  7. def calculate_ratio(orange_count, green_count):
  8.     total_count = orange_count + green_count
  9.     if total_count == 0:
  10.         return 0
  11.     return orange_count / total_count

  12. def judge_level(ratio):
  13.     if 0 < ratio <= 0.1:
  14.         return 0
  15.     elif 0.1 < ratio <= 0.2:
  16.         return 1
  17.     elif 0.2 < ratio <= 0.5:
  18.         return 2
  19.     elif 0.5 < ratio <= 1:
  20.         return 3

  21. def add_text_to_image(img, text, position):
  22.     font = cv2.FONT_HERSHEY_SIMPLEX
  23.     font_scale = 1
  24.     font_thickness = 2
  25.     font_color = (255, 255, 255)  # 白色
  26.     cv2.putText(img, text, position, font, font_scale, font_color, font_thickness, cv2.LINE_AA)

  27. def process_image(image_path):
  28.     # 读取图片
  29.     img = cv2.imread(image_path)

  30.     # 设置颜色范围(使用BGR顺序)
  31.     orange_lower = np.array([0, 84, 169], dtype=np.uint8)
  32.     orange_upper = np.array([1, 86, 171], dtype=np.uint8)
  33.     green_lower = np.array([0, 84, 0], dtype=np.uint8)
  34.     green_upper = np.array([1, 86, 1], dtype=np.uint8)

  35.     # 计算橙色和绿色像素数量
  36.     orange_count = count_pixels(img, orange_lower, orange_upper)
  37.     green_count = count_pixels(img, green_lower, green_upper)

  38.     # 计算橙色像素数量占比
  39.     ratio = calculate_ratio(orange_count, green_count)

  40.     # 判断比值属于哪个级别
  41.     level = judge_level(ratio)

  42.     # 将输出结果添加到图片的左下角
  43.     height, width, _ = img.shape
  44.     text_position = (10, height - 20)
  45.     text = f"橙色: {orange_count}, 绿色: {green_count}, 比值: {ratio:.2f}, 级别: {level}"
  46.     add_text_to_image(img, text, text_position)

  47.     # 保存图片
  48.     output_image_path = os.path.join("output", os.path.basename(image_path))
  49.     cv2.imwrite(output_image_path, img)

  50. def main():
  51.     # 图片文件夹路径
  52.     image_folder = "path/to/your/image/folder"
  53.     image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

  54.     # 创建输出文件夹
  55.     if not os.path.exists("output"):
  56.         os.mkdir("output")

  57.     # 处理每张图片
  58.     for image_path in image_files:
  59.         process_image(image_path)

  60. if __name__ == "__main__":
  61.     main()
复制代码


此代码将读取图片文件夹中的所有.jpg、.jpeg和.png图片,并处理每张图片。处理结果将以白色文本形式呈现在相应图片的左下角。处理过的图片将保存在与原始图片相同的文件名下,但位于名为"output"的新文件夹中。如果输出文件夹不存在,代码将自动创建一个。

请确保将image_folder变量设置为您的图片文件夹路径,并根据需要调整其他参数,例如字体、字体大小、字体颜色等。此代码将批量处理您的图片,并将带有结果标签的新图片保存到"output"文件夹中。

最佳答案

查看完整内容

以下是修改后的代码,将每张图片的输出结果以白色文本形式呈现在相应图片的左下角: 此代码将读取图片文件夹中的所有.jpg、.jpeg和.png图片,并处理每张图片。处理结果将以白色文本形式呈现在相应图片的左下角。处理过的图片将保存在与原始图片相同的文件名下,但位于名为"output"的新文件夹中。如果输出文件夹不存在,代码将自动创建一个。 请确保将image_folder变量设置为您的图片文件夹路径,并根据需要调整其他 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 10:35:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2023-4-12 16:21 编辑
黎明丿晓小 发表于 2023-4-12 16:06
请修改代码并加入以下要求:
1.将每张图片的输出结果以白色文本形式呈现在相应图片的左下角


以下是修改后的代码,将每张图片的输出结果以白色文本形式呈现在相应图片的左下角:

  1. import cv2
  2. import numpy as np
  3. import os

  4. def count_pixels(img, color_lower, color_upper):
  5.     mask = cv2.inRange(img, color_lower, color_upper)
  6.     return np.sum(mask == 255)

  7. def calculate_ratio(orange_count, green_count):
  8.     total_count = orange_count + green_count
  9.     if total_count == 0:
  10.         return 0
  11.     return orange_count / total_count

  12. def judge_level(ratio):
  13.     if 0 < ratio <= 0.1:
  14.         return 0
  15.     elif 0.1 < ratio <= 0.2:
  16.         return 1
  17.     elif 0.2 < ratio <= 0.5:
  18.         return 2
  19.     elif 0.5 < ratio <= 1:
  20.         return 3

  21. def add_text_to_image(img, text, position):
  22.     font = cv2.FONT_HERSHEY_SIMPLEX
  23.     font_scale = 1
  24.     font_thickness = 2
  25.     font_color = (255, 255, 255)  # 白色
  26.     cv2.putText(img, text, position, font, font_scale, font_color, font_thickness, cv2.LINE_AA)

  27. def process_image(image_path):
  28.     # 读取图片
  29.     img = cv2.imread(image_path)

  30.     # 设置颜色范围(使用BGR顺序)
  31.     orange_lower = np.array([0, 84, 169], dtype=np.uint8)
  32.     orange_upper = np.array([1, 86, 171], dtype=np.uint8)
  33.     green_lower = np.array([0, 84, 0], dtype=np.uint8)
  34.     green_upper = np.array([1, 86, 1], dtype=np.uint8)

  35.     # 计算橙色和绿色像素数量
  36.     orange_count = count_pixels(img, orange_lower, orange_upper)
  37.     green_count = count_pixels(img, green_lower, green_upper)

  38.     # 计算橙色像素数量占比
  39.     ratio = calculate_ratio(orange_count, green_count)

  40.     # 判断比值属于哪个级别
  41.     level = judge_level(ratio)

  42.     # 将输出结果添加到图片的左下角
  43.     height, width, _ = img.shape
  44.     text_position = (10, height - 20)
  45.     text = f"橙色: {orange_count}, 绿色: {green_count}, 比值: {ratio:.2f}, 级别: {level}"
  46.     add_text_to_image(img, text, text_position)

  47.     # 保存图片
  48.     output_image_path = os.path.join("output", os.path.basename(image_path))
  49.     cv2.imwrite(output_image_path, img)

  50. def main():
  51.     # 图片文件夹路径
  52.     image_folder = "path/to/your/image/folder"
  53.     image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

  54.     # 创建输出文件夹
  55.     if not os.path.exists("output"):
  56.         os.mkdir("output")

  57.     # 处理每张图片
  58.     for image_path in image_files:
  59.         process_image(image_path)

  60. if __name__ == "__main__":
  61.     main()
复制代码


此代码将读取图片文件夹中的所有.jpg、.jpeg和.png图片,并处理每张图片。处理结果将以白色文本形式呈现在相应图片的左下角。处理过的图片将保存在与原始图片相同的文件名下,但位于名为"output"的新文件夹中。如果输出文件夹不存在,代码将自动创建一个。

请确保将image_folder变量设置为您的图片文件夹路径,并根据需要调整其他参数,例如字体、字体大小、字体颜色等。此代码将批量处理您的图片,并将带有结果标签的新图片保存到"output"文件夹中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 10:59:58 | 显示全部楼层
以下是一个使用Python、OpenCV和Numpy的示例代码,用于实现您所需的功能:

  1. import cv2
  2. import numpy as np

  3. def count_pixels(img, color_lower, color_upper):
  4.     mask = cv2.inRange(img, color_lower, color_upper)
  5.     return np.sum(mask == 255)

  6. def calculate_ratio(orange_count, green_count):
  7.     total_count = orange_count + green_count
  8.     if total_count == 0:
  9.         return 0
  10.     return orange_count / total_count

  11. def judge_level(ratio):
  12.     if 0 < ratio <= 0.1:
  13.         return 0
  14.     elif 0.1 < ratio <= 0.2:
  15.         return 1
  16.     elif 0.2 < ratio <= 0.5:
  17.         return 2
  18.     elif 0.5 < ratio <= 1:
  19.         return 3

  20. def main():
  21.     # 读取图片
  22.     img = cv2.imread("example_image.jpg")

  23.     # 设置颜色范围
  24.     orange_lower = np.array([169, 84, 0], dtype=np.uint8)
  25.     orange_upper = np.array([171, 86, 1], dtype=np.uint8)
  26.     green_lower = np.array([0, 84, 0], dtype=np.uint8)
  27.     green_upper = np.array([1, 86, 1], dtype=np.uint8)

  28.     # 计算橙色和绿色像素数量
  29.     orange_count = count_pixels(img, orange_lower, orange_upper)
  30.     green_count = count_pixels(img, green_lower, green_upper)

  31.     # 计算橙色像素数量占比
  32.     ratio = calculate_ratio(orange_count, green_count)

  33.     # 判断比值属于哪个级别
  34.     level = judge_level(ratio)

  35.     print(f"橙色像素数量: {orange_count}")
  36.     print(f"绿色像素数量: {green_count}")
  37.     print(f"比值: {ratio}")
  38.     print(f"级别: {level}")

  39. if __name__ == "__main__":
  40.     main()
复制代码

这个示例代码首先读取图像文件,然后计算橙色和绿色像素的数量。

之后,它会计算橙色像素数量占橙色和绿色像素总数的比值,最后根据比值判断级别。

请注意,您需要根据实际情况调整颜色范围,以获得最佳结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-12 11:31:28 | 显示全部楼层
isdkz 发表于 2023-4-12 10:59
以下是一个使用Python、OpenCV和Numpy的示例代码,用于实现您所需的功能:

谢谢!但有一点错了,opencv读取的是BGR值而不是RGB值,所以设置颜色范围那一块的数值需要颠倒一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 12:10:43 | 显示全部楼层
黎明丿晓小 发表于 2023-4-12 11:31
谢谢!但有一点错了,opencv读取的是BGR值而不是RGB值,所以设置颜色范围那一块的数值需要颠倒一下

抱歉,您是对的。在OpenCV中,颜色是按BGR顺序而不是RGB顺序表示的。

请参考以下修正后的代码:

  1. import cv2
  2. import numpy as np

  3. def count_pixels(img, color_lower, color_upper):
  4.     mask = cv2.inRange(img, color_lower, color_upper)
  5.     return np.sum(mask == 255)

  6. def calculate_ratio(orange_count, green_count):
  7.     total_count = orange_count + green_count
  8.     if total_count == 0:
  9.         return 0
  10.     return orange_count / total_count

  11. def judge_level(ratio):
  12.     if 0 < ratio <= 0.1:
  13.         return 0
  14.     elif 0.1 < ratio <= 0.2:
  15.         return 1
  16.     elif 0.2 < ratio <= 0.5:
  17.         return 2
  18.     elif 0.5 < ratio <= 1:
  19.         return 3

  20. def main():
  21.     # 读取图片
  22.     img = cv2.imread("example_image.jpg")

  23.     # 设置颜色范围(使用BGR顺序)
  24.     orange_lower = np.array([0, 84, 169], dtype=np.uint8)
  25.     orange_upper = np.array([1, 86, 171], dtype=np.uint8)
  26.     green_lower = np.array([0, 84, 0], dtype=np.uint8)
  27.     green_upper = np.array([1, 86, 1], dtype=np.uint8)

  28.     # 计算橙色和绿色像素数量
  29.     orange_count = count_pixels(img, orange_lower, orange_upper)
  30.     green_count = count_pixels(img, green_lower, green_upper)

  31.     # 计算橙色像素数量占比
  32.     ratio = calculate_ratio(orange_count, green_count)

  33.     # 判断比值属于哪个级别
  34.     level = judge_level(ratio)

  35.     print(f"橙色像素数量: {orange_count}")
  36.     print(f"绿色像素数量: {green_count}")
  37.     print(f"比值: {ratio}")
  38.     print(f"级别: {level}")

  39. if __name__ == "__main__":
  40.     main()
复制代码

请注意,我已将颜色范围调整为BGR顺序。这应该能得到正确的结果。再次感谢您的指正!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-12 12:19:48 | 显示全部楼层
isdkz 发表于 2023-4-12 12:10
抱歉,您是对的。在OpenCV中,颜色是按BGR顺序而不是RGB顺序表示的。

请参考以下修正后的代码:

请修改代码并加入以下要求:
1.批量读取图片并实现此功能;
2.将每张图片的输出结果汇总到一个.txt文件中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 12:23:42 | 显示全部楼层
黎明丿晓小 发表于 2023-4-12 12:19
请修改代码并加入以下要求:
1.批量读取图片并实现此功能;
2.将每张图片的输出结果汇总到一个.txt文件 ...

以下是修改后的代码,支持批量读取图片并将输出结果汇总到一个.txt文件中:

  1. import cv2
  2. import numpy as np
  3. import os

  4. def count_pixels(img, color_lower, color_upper):
  5.     mask = cv2.inRange(img, color_lower, color_upper)
  6.     return np.sum(mask == 255)

  7. def calculate_ratio(orange_count, green_count):
  8.     total_count = orange_count + green_count
  9.     if total_count == 0:
  10.         return 0
  11.     return orange_count / total_count

  12. def judge_level(ratio):
  13.     if 0 < ratio <= 0.1:
  14.         return 0
  15.     elif 0.1 < ratio <= 0.2:
  16.         return 1
  17.     elif 0.2 < ratio <= 0.5:
  18.         return 2
  19.     elif 0.5 < ratio <= 1:
  20.         return 3

  21. def process_image(image_path):
  22.     # 读取图片
  23.     img = cv2.imread(image_path)

  24.     # 设置颜色范围(使用BGR顺序)
  25.     orange_lower = np.array([0, 84, 169], dtype=np.uint8)
  26.     orange_upper = np.array([1, 86, 171], dtype=np.uint8)
  27.     green_lower = np.array([0, 84, 0], dtype=np.uint8)
  28.     green_upper = np.array([1, 86, 1], dtype=np.uint8)

  29.     # 计算橙色和绿色像素数量
  30.     orange_count = count_pixels(img, orange_lower, orange_upper)
  31.     green_count = count_pixels(img, green_lower, green_upper)

  32.     # 计算橙色像素数量占比
  33.     ratio = calculate_ratio(orange_count, green_count)

  34.     # 判断比值属于哪个级别
  35.     level = judge_level(ratio)

  36.     return orange_count, green_count, ratio, level

  37. def main():
  38.     # 图片文件夹路径
  39.     image_folder = "path/to/your/image/folder"
  40.     image_files = [os.path.join(image_folder, f) for f in os.listdir(image_folder) if f.endswith(('.png', '.jpg', '.jpeg'))]

  41.     # 输出结果文件
  42.     output_file = "output.txt"

  43.     with open(output_file, "w") as f:
  44.         for image_path in image_files:
  45.             orange_count, green_count, ratio, level = process_image(image_path)
  46.             f.write(f"图片: {os.path.basename(image_path)}\n")
  47.             f.write(f"橙色像素数量: {orange_count}\n")
  48.             f.write(f"绿色像素数量: {green_count}\n")
  49.             f.write(f"比值: {ratio}\n")
  50.             f.write(f"级别: {level}\n\n")

  51. if __name__ == "__main__":
  52.     main()
复制代码


请将image_folder变量设置为您的图片文件夹路径。此代码将读取文件夹中的所有.jpg、.jpeg和.png图片,并处理每张图片。

处理结果将写入名为"output.txt"的文件中。您可以根据需要更改输出文件名。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-12 16:06:07 | 显示全部楼层
isdkz 发表于 2023-4-12 12:23
以下是修改后的代码,支持批量读取图片并将输出结果汇总到一个.txt文件中:

请修改代码并加入以下要求:
1.将每张图片的输出结果以白色文本形式呈现在相应图片的左下角
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表