鱼C论坛

 找回密码
 立即注册
查看: 1505|回复: 1

[已解决]如何用python识别图片?

[复制链接]
发表于 2020-12-17 14:30:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大神们,如何利用python识别这个图片有几个黄色菱形?颜色块颜色固定,不是渐变。
最佳答案
2020-12-17 19:04:04
本帖最后由 YunGuo 于 2020-12-17 20:32 编辑

你这张图我可以用这个方式,这个仅可统计黄色菱形数量。对opencv不是很熟悉,可能还有其它方法。
  1. import cv2
  2. import numpy as np


  3. img = cv2.imread('image.jpg')
  4. # 图像去噪
  5. img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
  6. # BGR转HSV
  7. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  8. # HSV黄色min值
  9. low_hsv = np.array([26, 43, 46])
  10. # HSV黄色max值
  11. upp_hsv = np.array([34, 255, 255])
  12. # 提取掩膜
  13. mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=upp_hsv)
  14. # 保存掩模后图片
  15. cv2.imwrite('huang.jpg', mask)
  16. img1 = cv2.imread('huang.jpg')
  17. # 转灰度图片
  18. imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
  19. # 获取白色图形轮廓
  20. ret, thresh = cv2.threshold(imgray, 127, 255, 0)
  21. contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  22. # 根据图形面积计算图形数量
  23. count = 0
  24. for cnt in contours:
  25.     # 获取每个图形面积
  26.     area = cv2.contourArea(cnt)
  27.     if 2700 <= area <= 3000:
  28.         count += 1
  29.     elif area >= 3000:
  30.         num = int(area / 2720)
  31.         count += num
  32. print(count)
复制代码


对代码优化了一下,可以统计出图中三种颜色的菱形分别是多少个
  1. import cv2
  2. import numpy as np


  3. def hsv_img(img, color):
  4.     image1 = cv2.imread(img)
  5.     # 图像去噪
  6.     image1 = cv2.fastNlMeansDenoisingColored(image1, None, 10, 10, 7, 21)
  7.     # BGR转HSV
  8.     hsv = cv2.cvtColor(image1, cv2.COLOR_BGR2HSV)
  9.     if color == "黄色":
  10.         # 当前颜色的hsv值
  11.         low_hsv = np.array([26, 43, 46])
  12.         upp_hsv = np.array([34, 255, 255])
  13.         # 黄色面积1600
  14.         area = 1600
  15.         # 处理图片
  16.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  17.         print(f'{color}数量:', result)
  18.     elif color == "紫色":
  19.         low_hsv = np.array([125, 43, 46])
  20.         upp_hsv = np.array([155, 255, 255])
  21.         # 紫色面积1700
  22.         area = 1700
  23.         # 处理图片
  24.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  25.         print(f'{color}数量:', result)
  26.     elif color == "绿色":
  27.         low_hsv = np.array([35, 43, 46])
  28.         upp_hsv = np.array([77, 255, 255])
  29.         # 绿色面积1900
  30.         area = 1900
  31.         # 处理图片
  32.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  33.         print(f'{color}数量:', result)


  34. def handle_img(area, hsv, low, upp):
  35.     # 提取掩膜
  36.     mask = cv2.inRange(hsv, lowerb=low, upperb=upp)
  37.     # 保存掩模后图片
  38.     cv2.imwrite('mask.jpg', mask)
  39.     img1 = cv2.imread('mask.jpg')
  40.     # 转灰度图片
  41.     imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
  42.     # 对图形进行侵蚀,分离相连的图形
  43.     kernel = np.ones((5, 5), np.uint8)
  44.     erosion = cv2.erode(imgray, kernel, iterations=2)
  45.     # 获取白色图形轮廓
  46.     ret, thresh = cv2.threshold(erosion, 127, 255, 0)
  47.     contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  48.     # 根据图形面积统计图形数量
  49.     count = 0
  50.     for cnt in contours:
  51.         # 获取每个图形面积
  52.         area1 = cv2.contourArea(cnt)
  53.         if area1 >= area:
  54.             count += 1
  55.     return count


  56. if __name__ == '__main__':
  57.     image = 'image.jpg'
  58.     hsv_img(image, '黄色')
  59.     hsv_img(image, '紫色')
  60.     hsv_img(image, '绿色')
复制代码
u=1929889413,2818727953&amp;fm=15&amp;gp=0.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-17 19:04:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 YunGuo 于 2020-12-17 20:32 编辑

你这张图我可以用这个方式,这个仅可统计黄色菱形数量。对opencv不是很熟悉,可能还有其它方法。
  1. import cv2
  2. import numpy as np


  3. img = cv2.imread('image.jpg')
  4. # 图像去噪
  5. img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
  6. # BGR转HSV
  7. hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  8. # HSV黄色min值
  9. low_hsv = np.array([26, 43, 46])
  10. # HSV黄色max值
  11. upp_hsv = np.array([34, 255, 255])
  12. # 提取掩膜
  13. mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=upp_hsv)
  14. # 保存掩模后图片
  15. cv2.imwrite('huang.jpg', mask)
  16. img1 = cv2.imread('huang.jpg')
  17. # 转灰度图片
  18. imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
  19. # 获取白色图形轮廓
  20. ret, thresh = cv2.threshold(imgray, 127, 255, 0)
  21. contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  22. # 根据图形面积计算图形数量
  23. count = 0
  24. for cnt in contours:
  25.     # 获取每个图形面积
  26.     area = cv2.contourArea(cnt)
  27.     if 2700 <= area <= 3000:
  28.         count += 1
  29.     elif area >= 3000:
  30.         num = int(area / 2720)
  31.         count += num
  32. print(count)
复制代码


对代码优化了一下,可以统计出图中三种颜色的菱形分别是多少个
  1. import cv2
  2. import numpy as np


  3. def hsv_img(img, color):
  4.     image1 = cv2.imread(img)
  5.     # 图像去噪
  6.     image1 = cv2.fastNlMeansDenoisingColored(image1, None, 10, 10, 7, 21)
  7.     # BGR转HSV
  8.     hsv = cv2.cvtColor(image1, cv2.COLOR_BGR2HSV)
  9.     if color == "黄色":
  10.         # 当前颜色的hsv值
  11.         low_hsv = np.array([26, 43, 46])
  12.         upp_hsv = np.array([34, 255, 255])
  13.         # 黄色面积1600
  14.         area = 1600
  15.         # 处理图片
  16.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  17.         print(f'{color}数量:', result)
  18.     elif color == "紫色":
  19.         low_hsv = np.array([125, 43, 46])
  20.         upp_hsv = np.array([155, 255, 255])
  21.         # 紫色面积1700
  22.         area = 1700
  23.         # 处理图片
  24.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  25.         print(f'{color}数量:', result)
  26.     elif color == "绿色":
  27.         low_hsv = np.array([35, 43, 46])
  28.         upp_hsv = np.array([77, 255, 255])
  29.         # 绿色面积1900
  30.         area = 1900
  31.         # 处理图片
  32.         result = handle_img(area, hsv, low_hsv, upp_hsv)
  33.         print(f'{color}数量:', result)


  34. def handle_img(area, hsv, low, upp):
  35.     # 提取掩膜
  36.     mask = cv2.inRange(hsv, lowerb=low, upperb=upp)
  37.     # 保存掩模后图片
  38.     cv2.imwrite('mask.jpg', mask)
  39.     img1 = cv2.imread('mask.jpg')
  40.     # 转灰度图片
  41.     imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
  42.     # 对图形进行侵蚀,分离相连的图形
  43.     kernel = np.ones((5, 5), np.uint8)
  44.     erosion = cv2.erode(imgray, kernel, iterations=2)
  45.     # 获取白色图形轮廓
  46.     ret, thresh = cv2.threshold(erosion, 127, 255, 0)
  47.     contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  48.     # 根据图形面积统计图形数量
  49.     count = 0
  50.     for cnt in contours:
  51.         # 获取每个图形面积
  52.         area1 = cv2.contourArea(cnt)
  53.         if area1 >= area:
  54.             count += 1
  55.     return count


  56. if __name__ == '__main__':
  57.     image = 'image.jpg'
  58.     hsv_img(image, '黄色')
  59.     hsv_img(image, '紫色')
  60.     hsv_img(image, '绿色')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-30 05:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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