60024


画像を分割して赤の割合が多い分割エリアを枠で囲みたいのですがどうにもできません  
各分割エリアの赤の割合まではだせるようになったのですが、、、。  
いい方法をご存じの方教えてくださいm(__)m

例えば、リンゴの画像を9分割したとき真ん中のエリアが一番赤の割合が多いので枠で囲む、みたいなことがしたいです  
[![](https://i.stack.imgur.com/ymwPy.png)](https://i.stack.imgur.com/ymwPy.png)

[code]

    import numpy as np
    import cv2
    import glob
    import os
    
    os.chdir("./test")
    
    image = []
    image = glob.glob('*.bmp')
    print(image)
    
    try:
        os.makedirs(".././test_result")
    except FileExistsError:
        pass
    
    
    def split_imgs(img, hsplits=3, vsplits=3):
        h, w = img.shape[:2]
        crop_img = img[: h // vsplits * vsplits, : w // hsplits * hsplits]
    
        return np.array(
            [x for h_img in np.vsplit(crop_img, vsplits) for x in np.hsplit(h_img, hsplits)]
        )
    
    
    
    for i in image:
    
        img = cv2.imread(i)
    
    
        hsplits = 3  # 横方向の分割数
        vsplits = 3  # 縦方向の分割数
    
        sub_imgs = split_imgs(img, hsplits, vsplits)
        print(sub_imgs.shape)  # (9, 140, 186, 3)
    
    
        for ch in sub_imgs:
            # HSV 色空間に変換する。
            hsv = cv2.cvtColor(ch, cv2.COLOR_BGR2HSV)
            # 赤色のHSV範囲
            hsv_min = np.array([0, 64, 0])
            hsv_max = np.array([30, 255, 255])
    
            mask = cv2.inRange(hsv, hsv_min,  hsv_max)
            m = cv2.countNonZero(mask)
            h, w = mask.shape
            per = round(100*float(m)/(w * h),1)
            print("Moment[px]:",m)
            print("Percent[%]:", per)
    
[/code]


CC BY-SA 4.0
2019-10-27T15:26:46.083
60020
2019-10-27T21:05:58.893
36204
question
python 画像
分割した画像に枠線をつけたい


エラーチェックは省いています。それから、赤色のHSV範囲についてですが、色相(Hue)に関しては複数の範囲があります(コード内の `hsv_red1` と
`hsv_red2`)。彩度(Saturation)と明度(Value)に関しては適宜調整して下さい。

[code]

    import numpy as np
    import cv2
    import glob
    import os
    
    image_files = '*.png'
    image_dir = './test'
    output_dir = './test_result'
    hsv_red1 = ((  0, 64, 0), ( 30, 255, 255))
    hsv_red2 = ((150, 64, 0), (179, 255, 255))
    border_color = (255, 0, 0)
    hsplits, vsplits = 3, 3
    
    def split_imgs(img):
      h, w = img.shape[:2]
      crop_img = img[:h//vsplits*vsplits, :w//hsplits*hsplits]
    
      return [x for h_img in np.vsplit(crop_img, vsplits) for x in np.hsplit(h_img, hsplits)]
    
    def get_max_ratio_area(img):
      imgs = split_imgs(img)
      area = np.prod(imgs[0].shape[:2])
      ratio_max = 0
      for i, splt in enumerate(imgs):
        hsv = cv2.cvtColor(splt, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, *hsv_red1) + cv2.inRange(hsv, *hsv_red2)
        ratio = cv2.countNonZero(mask)/area
        if ratio > ratio_max:
          ratio_max, idx = ratio, i
    
      return (idx % hsplits, idx // hsplits)
    
    def draw_border(img, x, y):
      h, w = img.shape[:2]
      vu, hu = h//vsplits, w//hsplits
      cv2.rectangle(img, (x*hu, y*vu), ((x+1)*hu, (y+1)*vu), border_color, 3)
    
    if __name__ == "__main__":
      for f in glob.glob(os.path.join(image_dir, image_files)):
        img = cv2.imread(f)
        pos = get_max_ratio_area(img)
        draw_border(img, *pos)
        cv2.imwrite(os.path.join(output_dir, os.path.basename(f)), img)
    
[/code]


CC BY-SA 4.0
2019-10-27T21:05:58.893
60024
2019-10-27T21:05:58.893
60020
answer