Не обрабатывает изображения с фоном 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()
Обработка не идёт результат такой [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