Не обрабатывает изображения с фоном r,,g,b=255,255,255

Программа для поиска площади(square), длинны(width_seed), ширины(height_seed), частей длинны и ширины, углов в ромбе внутри семечки(first_angle,second_angle,third_angle, fourth_angle), площади четвертей за пределами треугольников ромбов(s_dug1, s_dug2, s_dug3, s_dug4) отношения длинны и ширины к их первым половинам (zol_w и zol_h). Данные программа должна считывать с изображений папки white_png и заполнять результаты в файл white_seeds_of_sunflowers_rotated_NOBackground.csv. Обрабатываются белые семечки повёрнутые горизонтально. Просчёт должен проходить в цикле. Подскажите в чём особеннось обработки изображений с удалённым фоном.

import os
import numpy as np
import cv2
import math
import csv

IMAGES_DIRECTORY = 'white_png'


def main():
    results = []

    for filename in os.listdir(IMAGES_DIRECTORY):
        file_path = os.path.abspath(os.path.join(IMAGES_DIRECTORY, filename))
        if os.path.isfile(file_path):
            result = process_image(file_path)

            if result:
                results.append(result)

            print(f"Результат для {filename}: {result}")
    headers = ['Name', 'lineA', 'lineB', 'lineC', 'lineD', 'firstAngle', 'secondAngle', 'thirdAngle', 'fourthAngle',
               'square', 'S_Dug1', 'S_Dug2', 'S_Dug3', 'S_Dug4', 'zolH', 'zolW', 'heightSeed', 'widthSeed']
    with open('white_seeds_of_sunflowers_rotated_NOBackground.csv', 'w', newline='') as f:
        write = csv.writer(f, delimiter=';')
        write.writerow(headers)
        write.writerows(results)


def process_image(file_path):
    directory, filename = os.path.split(file_path)

    image = cv2.imread(file_path)
    if image is None:
        print(f"Не удалось загрузить изображение: {file_path}")
        return None

    r, g, b = cv2.split(image)

    # Игнорируем пиксели белого фона (255, 255, 255)
    bit_matrix = np.logical_not(np.logical_and(r == 255, g == 255, b == 255))
    numb_matrix = bit_matrix.astype(int)

    # Найдем координаты крайних точек
    max_row_coordinates, max_col_coordinates = find_coordinates(numb_matrix)

    if not max_row_coordinates or not max_col_coordinates:
        return None  # Если не удалось найти крайние точки, пропускаем изображение

    try:
        min_r = min(max_row_coordinates)
        max_r = max(max_row_coordinates)
        min_c = min(max_col_coordinates)
        max_c = max(max_col_coordinates)
    except ValueError:
        return None  # Если не удалось получить координаты, пропускаем изображение

    x_min_r_coordinate = min_r[0]
    y_min_r_coordinate = min_r[1]
    x_max_r_coordinate = max_r[0]
    y_max_r_coordinate = max_r[1]
    x_min_c_coordinate = min_c[0]
    y_min_c_coordinate = min_c[1]
    x_max_c_coordinate = max_c[0]
    y_max_c_coordinate = max_c[1]

    # Линии по координатам
    l_1 = [[x_min_r_coordinate, y_min_r_coordinate], [x_max_r_coordinate, y_max_r_coordinate]]
    l_2 = [[x_min_c_coordinate, y_min_c_coordinate], [x_max_c_coordinate, y_max_c_coordinate]]

    # Разница координат
    xd = (l_1[0][0] - l_1[1][0], l_2[0][0] - l_2[1][0])
    yd = (l_1[0][1] - l_1[1][1], l_2[0][1] - l_2[1][1])
    div = xd[0] * yd[1] - xd[1] * yd[0]

    if div == 0:
        return None  # Линии не пересекаются, пропускаем изображение

    d = (l_1[0][0] * l_1[1][1] - l_1[0][1] * l_1[1][0], l_2[0][0] * l_2[1][1] - l_2[0][1] * l_2[1][0])
    x = (d[0] * xd[1] - d[1] * xd[0]) / div
    y = (d[0] * yd[1] - d[1] * yd[0]) / div

    # Рассчитываем площади и другие параметры
    square = np.sum(numb_matrix)
    # Рассчитываем длины линий
    line_a = abs(y - y_min_r_coordinate)
    line_b = abs(y_max_r_coordinate - y)
    line_c = abs(x - x_min_c_coordinate)
    line_d = abs(x_max_c_coordinate - x)

    # Если линии равны нулю, пропускаем
    if not (line_a and line_b and line_c and line_d):
        return None

    # Рассчет углов
    hip1 = math.sqrt(line_a ** 2 + line_c ** 2)
    hip2 = math.sqrt(line_c ** 2 + line_d ** 2)
    hip3 = math.sqrt(line_b ** 2 + line_d ** 2)
    hip4 = math.sqrt(line_a ** 2 + line_d ** 2)
    beta1 = math.asin(line_c / hip1) * (180 / math.pi) if hip1 != 0 else 0
    beta2 = math.asin(line_c / hip2) * (180 / math.pi) if hip2 != 0 else 0
    beta3 = math.asin(line_d / hip3) * (180 / math.pi) if hip3 != 0 else 0
    beta4 = math.asin(line_d / hip4) * (180 / math.pi) if hip4 != 0 else 0

    alpha1 = 90 - beta1  # Первая половина 2 угла
    alpha2 = 90 - beta2  # Первал половина 4 угла
    alpha3 = 90 - beta3  # Вторая половина 4 угла
    alpha4 = 90 - beta4  # Вторая половина 2 угла

    first_angle = beta1 + beta4  # Первый угол
    second_angle = alpha1 + alpha2  # Второй укол
    third_angle = beta2 + beta3  # Третий угол
    fourth_angle = alpha3 + alpha4  # Четвёртый угол
    rs1 = line_a * line_c / 2  # Площа 1 трикутника
    rs2 = line_c * line_b / 2  # Площа 2 трикутника
    rs3 = line_b * line_d / 2  # Площа 3 трикутника
    rs4 = line_a * line_d / 2  # Площа 4 трикутника
    rmb = rs1 + rs2 + rs3 + rs4

    r_proportion1 = rmb / rs1 if rs1 != 0 else 0
    r_proportion2 = rmb / rs2 if rs2 != 0 else 0
    r_proportion3 = rmb / rs3 if rs3 != 0 else 0
    r_proportion4 = rmb / rs4 if rs4 != 0 else 0

    square1 = square / r_proportion1 if r_proportion1 != 0 else 0
    square2 = square / r_proportion2 if r_proportion2 != 0 else 0
    square3 = square / r_proportion3 if r_proportion3 != 0 else 0
    square4 = square / r_proportion4 if r_proportion4 != 0 else 0
    s_dug1 = square1 - rs1
    s_dug2 = square2 - rs2
    s_dug3 = square3 - rs3
    s_dug4 = square4 - rs4

    # Рассчет других параметров
    zol_h = (line_c + line_d) / line_c if line_c != 0 else 0
    zol_w = (line_a + line_b) / line_a if line_a != 0 else 0
    width_seed = line_a + line_b
    height_seed = line_c + line_d

    return [filename, line_a, line_b, line_c, line_d, first_angle, second_angle, third_angle, fourth_angle,
            square, s_dug1, s_dug2, s_dug3, s_dug4, zol_h, zol_w, height_seed, width_seed]


def find_coordinates(numb_matrix):
    max_row_index = find_max_row(numb_matrix)
    max_col_index = find_max_column(numb_matrix)

    max_row = numb_matrix[max_row_index]
    max_col = [numb_matrix[i][max_col_index] for i in range(len(numb_matrix))]

    max_row_ones = [i for i, val in enumerate(max_row) if val == 1]
    max_col_ones = [i for i, val in enumerate(max_col) if val == 1]

    return [(max_row_index, col) for col in max_row_ones], [(row, max_col_index) for row in max_col_ones]


def find_max_row(numb_matrix):
    max_sum = 0
    max_row_index = -1
    for i, row in enumerate(numb_matrix):
        row_sum = sum(row)
        if row_sum > max_sum:
            max_sum = row_sum
            max_row_index = i
    return max_row_index


def find_max_column(numb_matrix):
    max_sum = 0
    max_col_index = -1
    for j in range(len(numb_matrix[0])):
        col_sum = sum(numb_matrix[i][j] for i in range(len(numb_matrix)))
        if col_sum > max_sum:
            max_sum = col_sum
            max_col_index = j
    return max_col_index


if __name__ == '__main__':
    main()

введите сюда описание изображениявведите сюда описание изображения Обработка не идёт результат такой [введите сюда описание изображения][1]D:\Git2024\horizontalSeed.venv\Scripts\python.exe D:\Git2024\horizontalSeed\main.py Результат для 2020-204-4-1.png: None Результат для 2020-204-4-2.png: None Результат для 2020-204-5-1.png: None Результат для 2020-204-5-2.png: None Результат для 2020-204-6-1.png: None Результат для 2020-204-7-1.png: None Результат для 2020-204-7-2.png: None Результат для 2020-204-8-1.png: None

Process finished with exit code 0


Ответы (0 шт):