---
# System prepended metadata

title: 番茄熟度辨識處理

---

# 番茄熟度辨識處理

![](https://i.imgur.com/enF1ERM.png)

[番茄colab程式](https://colab.research.google.com/drive/1e_bWN7B3WPfxeuX5wlq4tinJtcgTMEZ5#scrollTo=V1pEfD9yEcBS)

yolo取番茄->圖去背->計算像素比->模糊規則->結果上傳

## YoloV5 摳圖
~~[yolov5結果取圖](https://blog.csdn.net/qq_36756866/article/details/116762837)
Caution
--resize大小
--路徑位置
--方框遮擋圖片  [解決辦法](https://blog.csdn.net/weixin_44834086/article/details/125250363)~~
<font color="red">2023/2/22更
YoloV5中 detect.py參數中的--save_crops就有裁切功能</font>✔️

## Pre-processing(預處理)
1.Resizing Images✔️
re-sized all images to 250 × 250
2.Background Removal
<font color="red">2023/02/25
    處理辦法:
    背景去除算法
    API去背(花錢)
    [重新label圖片訓練新模型](https://chtseng.wordpress.com/2020/06/18/labelme%E8%88%87coco%E5%BD%B1%E5%83%8F%E5%88%86%E5%89%B2%E6%A8%99%E8%A8%98/)</font>
    2023/3/9 今日進度:label到134
    [labelme使用](https://github.com/wkentaro/labelme#windows)
    2023/5/2 放棄重新label，跳過此階段
3.Convert RGB to HSV color space
4.Extract(H,S,V) Compoents


## Feature extraction(特徵提取)
提取個顏色與原圖像素比
![](https://i.imgur.com/oZzYj0L.png)
![](https://i.imgur.com/VFrFGac.png)
![](https://i.imgur.com/wc08W4E.png)

## Generate fuzzy rule base for the system(模糊規則)
4 channel green,yellow,orange,red
4 degree xs,s,m,l
if rule 256 判別成熟度
4 result


(2023/5/2)程式:
```
import cv2
import numpy as np
import os

def ripeness_judgement(input_folder):
    for filename in os.listdir(input_folder):
        if filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".png"):
            # 讀入圖片
            img = cv2.imread(os.path.join(input_folder, filename))            

            # 轉換成 HSV
            hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)      

            # 定義綠、黃、橘、紅的顏色範圍 (HSV)
            lower_green = np.array([35, 43, 46])
            upper_green = np.array([77, 255, 255])
            lower_yellow = np.array([26, 43, 46])
            upper_yellow = np.array([34, 255, 255])
            lower_orange = np.array([11, 43, 46])
            upper_orange = np.array([25, 255, 255])
            lower_red = np.array([0, 43, 46])
            upper_red = np.array([10, 255, 255])

            # 進行色度分割
            mask_green = cv2.inRange(hsv, lower_green, upper_green)
            mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)
            mask_orange = cv2.inRange(hsv, lower_orange, upper_orange)
            mask_red = cv2.inRange(hsv, lower_red, upper_red)

            # 取得各個顏色部分的圖像
            green_part = cv2.bitwise_and(img, img, mask=mask_green)
            yellow_part = cv2.bitwise_and(img, img, mask=mask_yellow)
            orange_part = cv2.bitwise_and(img, img, mask=mask_orange)
            red_part = cv2.bitwise_and(img, img, mask=mask_red)


            # 計算像素與去除綠色圖比例
            total_pixels = np.count_nonzero(img)
            green_pixels = cv2.countNonZero(mask_green)
            yellow_pixels = cv2.countNonZero(mask_yellow)
            orange_pixels = cv2.countNonZero(mask_orange)
            red_pixels = cv2.countNonZero(mask_red)

            green_ratio = green_pixels / total_pixels
            yellow_ratio = yellow_pixels / total_pixels
            orange_ratio = orange_pixels / total_pixels
            red_ratio = red_pixels / total_pixels

            print("{}\n".format(filename))
            print("Green_ratio", green_ratio)
            print("Yellow ratio:", yellow_ratio)
            print("Orange ratio:", orange_ratio)
            print("Red ratio:", red_ratio,"\n")
            
            
            # 放大圖片
            scale = 5
            img = cv2.resize(img, (img.shape[1] * scale, img.shape[0] * scale))
            green_part = cv2.resize(green_part, (green_part.shape[1] * scale, green_part.shape[0] * scale))
            yellow_part = cv2.resize(yellow_part, (yellow_part.shape[1] * scale, yellow_part.shape[0] * scale))
            orange_part = cv2.resize(orange_part, (orange_part.shape[1] * scale, orange_part.shape[0] * scale))
            red_part = cv2.resize(red_part, (red_part.shape[1] * scale, red_part.shape[0] * scale))


            if not os.path.exists("output"):
                os.makedirs("output")
            if not os.path.exists("output/{}".format(filename)):
                if green_ratio >0.15 and orange_ratio <0.05 and red_ratio <0.05:
                    cv2.imwrite("output/Immature_{}.png".format(filename), img)
                elif yellow_ratio > 0.05:
                    cv2.imwrite("output/Break_{}.png".format(filename), img)
                elif orange_ratio > 0.1 and red_ratio < 0.08 and yellow_ratio < 0.6:
                    cv2.imwrite("output/Pre-harvest_{}.png".format(filename), img)
                elif red_ratio > orange_ratio:
                    cv2.imwrite("output/Harvest_{}.png".format(filename), img)
                else:
                    cv2.imwrite("output/unclear_{}.png".format(filename), img)
            else:
                if green_ratio >0.15 and orange_ratio <0.05 and red_ratio <0.05:
                    cv2.imwrite("output/Immature_{}_2.png".format(filename), img)
                elif yellow_ratio > 0.05:
                    cv2.imwrite("output/Break_{}_2.png".format(filename), img)
                elif orange_ratio > 0.1 and red_ratio < 0.08 and yellow_ratio < 0.6:
                    cv2.imwrite("output/Pre-harvest_{}_2.png".format(filename), img)
                elif red_ratio > orange_ratio:
                    cv2.imwrite("output/Harvest_{}_2.png".format(filename), img)
                else:
                    cv2.imwrite("output/unclear_{}_2.png".format(filename), img)

for k in range(1,3):
    if k==1:
        input_folder = r"crops\ripe"
        print("ripe開始處理\n")
        ripeness_judgement(input_folder)
    elif k==2:
        input_folder = r"crops\unripe"
        print("unripe開始處理\n")
        ripeness_judgement(input_folder)
```

## Result

![](https://i.imgur.com/8hfW84w.png)


