鱼C论坛

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

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

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

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

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

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

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


img = cv2.imread('image.jpg')
# 图像去噪
img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# HSV黄色min值
low_hsv = np.array([26, 43, 46])
# HSV黄色max值
upp_hsv = np.array([34, 255, 255])
# 提取掩膜
mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=upp_hsv)
# 保存掩模后图片
cv2.imwrite('huang.jpg', mask)
img1 = cv2.imread('huang.jpg')
# 转灰度图片
imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# 获取白色图形轮廓
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 根据图形面积计算图形数量
count = 0
for cnt in contours:
    # 获取每个图形面积
    area = cv2.contourArea(cnt)
    if 2700 <= area <= 3000:
        count += 1
    elif area >= 3000:
        num = int(area / 2720)
        count += num
print(count)

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


def hsv_img(img, color):
    image1 = cv2.imread(img)
    # 图像去噪
    image1 = cv2.fastNlMeansDenoisingColored(image1, None, 10, 10, 7, 21)
    # BGR转HSV
    hsv = cv2.cvtColor(image1, cv2.COLOR_BGR2HSV)
    if color == "黄色":
        # 当前颜色的hsv值
        low_hsv = np.array([26, 43, 46])
        upp_hsv = np.array([34, 255, 255])
        # 黄色面积1600
        area = 1600
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)
    elif color == "紫色":
        low_hsv = np.array([125, 43, 46])
        upp_hsv = np.array([155, 255, 255])
        # 紫色面积1700
        area = 1700
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)
    elif color == "绿色":
        low_hsv = np.array([35, 43, 46])
        upp_hsv = np.array([77, 255, 255])
        # 绿色面积1900
        area = 1900
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)


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


if __name__ == '__main__':
    image = 'image.jpg'
    hsv_img(image, '黄色')
    hsv_img(image, '紫色')
    hsv_img(image, '绿色')
u=1929889413,2818727953&amp;fm=15&amp;gp=0.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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


img = cv2.imread('image.jpg')
# 图像去噪
img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
# BGR转HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# HSV黄色min值
low_hsv = np.array([26, 43, 46])
# HSV黄色max值
upp_hsv = np.array([34, 255, 255])
# 提取掩膜
mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=upp_hsv)
# 保存掩模后图片
cv2.imwrite('huang.jpg', mask)
img1 = cv2.imread('huang.jpg')
# 转灰度图片
imgray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
# 获取白色图形轮廓
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 根据图形面积计算图形数量
count = 0
for cnt in contours:
    # 获取每个图形面积
    area = cv2.contourArea(cnt)
    if 2700 <= area <= 3000:
        count += 1
    elif area >= 3000:
        num = int(area / 2720)
        count += num
print(count)

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


def hsv_img(img, color):
    image1 = cv2.imread(img)
    # 图像去噪
    image1 = cv2.fastNlMeansDenoisingColored(image1, None, 10, 10, 7, 21)
    # BGR转HSV
    hsv = cv2.cvtColor(image1, cv2.COLOR_BGR2HSV)
    if color == "黄色":
        # 当前颜色的hsv值
        low_hsv = np.array([26, 43, 46])
        upp_hsv = np.array([34, 255, 255])
        # 黄色面积1600
        area = 1600
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)
    elif color == "紫色":
        low_hsv = np.array([125, 43, 46])
        upp_hsv = np.array([155, 255, 255])
        # 紫色面积1700
        area = 1700
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)
    elif color == "绿色":
        low_hsv = np.array([35, 43, 46])
        upp_hsv = np.array([77, 255, 255])
        # 绿色面积1900
        area = 1900
        # 处理图片
        result = handle_img(area, hsv, low_hsv, upp_hsv)
        print(f'{color}数量:', result)


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


if __name__ == '__main__':
    image = 'image.jpg'
    hsv_img(image, '黄色')
    hsv_img(image, '紫色')
    hsv_img(image, '绿色')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 00:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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