Мой код работает только с одним файлом изображения, остальные файлы изображений считываются и сохраняются, но мой код не затрагивает их. Мне нужно, чтобы мой код работал со всеми файлами изображений

Я новичок в Python. Я использую Glob для пакетной обработки нескольких файлов изображений. Когда я запускаю свой код, он обрабатывает и сохраняет все файлы изображений должным образом, но мой код влияет только на один файл изображения, все остальные файлы изображений не затрагиваются моим кодом. Мне нужно, чтобы мой код влиял на все изображения. Когда я запускаю свой код для двух файлов изображений Checker Board, затрагивается только один файл изображения, другой файл изображения не затрагивается моим кодом, как показано на изображениях.

Я попытался изучить больше, чтобы найти решение, но не смог найти его, вот мой код.

Заранее спасибо,

import numpy as np
import cv2
import os
import glob
from skimage import img_as_ubyte

image_list = []

path = "opencv/imgs/*.*"

for file in glob.glob(path):
    print(file)
    img = cv2.imread(file)
    a = cv2.imread(file)
    image_list.append(img)

    print(a)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray,50,200,apertureSize=3)
    img_blur = cv2.GaussianBlur(gray, (3,5), 2)
    edges = cv2.Canny(image=img_blur, threshold1=25, threshold2=50) # Canny Edge Detection

# Apply HoughLinesP method to 
# to directly obtain line end points
lines_list =[]
lines = cv2.HoughLinesP(
            edges, # Input edge image
            1, # Distance resolution in pixels
            np.pi/2, # Angle resolution in radians
            threshold=225, # Min number of votes for valid line
            minLineLength=60, # Min allowed length of line
            maxLineGap=400) # Max allowed gap between line for joining them
           
 
# Iterate over points
for points in lines:
      # Extracted points nested in the list
    x0,y1,x0,y2=points[0]
    # Draw the lines joing the points
    # On the original image
    cv2.line(img,(x0,y1),(x0,y2),(0,255,0),4)
    # Maintain a simples lookup list for points
    lines_list.append([(x0,y1),(x0,y2)])

image_list = np.array(image_list)
    
# Save the result image
img_number = 1
for image in range(image_list.shape[0]):
        input_img = image_list[image,:,:]
        lines_image = img_as_ubyte(input_img)
        cv2.imwrite(path+str(img_number)+".jpg", lines_image)
        img_number +=1 

В первом цикле for вы присваиваете объекты изображений только некоторым переменным без дальнейшего сохранения или обработки изображений. Переменные перезаписываются при каждой итерации, и для дальнейшей обработки после цикла сохраняются только изображения последней итерации. Вам придется включить большую часть дальнейшей обработки в первый цикл for.

Michael Butscher 22.06.2024 21:25

Я могу только порекомендовать Учебник по Python по Python в целом и такие сайты, как leetcode.com для практики при решении задач по программированию. Практика, как правило, является наиболее важным способом научиться программировать.

Michael Butscher 23.06.2024 00:52

Возможно, сначала используйте print()print(type(...)), print(len(...)) и т. д.), чтобы увидеть, какая часть кода выполняется и что на самом деле у вас есть в переменных. Он называется "print debugging" и помогает увидеть, что на самом деле делает код.

furas 23.06.2024 01:41

у вас неправильные отступы — все вычисления придется выполнять внутри for-цикла. Вы вычисляете edge внутри цикла for (поэтому вы делаете это для всех изображений), но позже вы вычисляете HoughLinesP снаружи for-цикла, поэтому вы делаете это только для одного файла. И остальная часть кода имеет ту же проблему. Если вы используете print(), чтобы увидеть, какая строка кода выполняется и что у вас в переменных, вы должны увидеть проблему. Возможно, создайте функцию, которая получает имя файла и выполняет все вычисления для одного файла - и сохраняет этот файл - а затем запускает эту функцию for file in glob.glob(path):

furas 23.06.2024 01:44

честно говоря, я не понимаю вашего последнего for-цикла. Вам следует написать напрямую img - и сделать это внутри for file in glob.glob(path):

furas 23.06.2024 02:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вся твоя проблема это потому, что у тебя неправильные отступы. Вы запускаете edge для каждого изображения (потому что оно все еще находится внутри for-цикла), но вы запускаете HoughLinesP снаружи for-цикла, поэтому он выполняется только для одного изображения.

И я не понимаю, почему потом вы используете еще один for-цикл.
Вы должны сохранить текущее изображение в первом цикле, и этот цикл перейдет в начало для обработки следующего изображения.

Что-то вроде этого:

import glob
import cv2

folder = "opencv/imgs" 
path = f"{folder}/*.*"

for index, file in enumerate(glob.glob(path), 1):
    print(index, 'file:', file)

    # read only one file

    img = cv2.imread(file)
    print(img)

    # process only one file
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 200, apertureSize=3)
    img_blur = cv2.GaussianBlur(gray, (3, 5), 2)
    edges = cv2.Canny(image=img_blur, threshold1=25, threshold2=50) # Canny Edge Detection

    # Apply HoughLinesP method to 
    # to directly obtain line end points
    lines = cv2.HoughLinesP(
                edges,            # Input edge image
                1,                # Distance resolution in pixels
                np.pi/2,          # Angle resolution in radians
                threshold=225,    # Min number of votes for valid line
                minLineLength=60, # Min allowed length of line
                maxLineGap=400)   # Max allowed gap between line for joining them
           
    # Iterate over points
    lines_list = []
    for points in lines:
        # Extracted points nested in the list
        x0, y1, x0, y2 = points[0]
        
        # Draw the lines joing the points
        # On the original image
        cv2.line(img, (x0, y1), (x0, y2), (0, 255, 0), 4)
        
        # Maintain a simples lookup list for points  ???
        lines_list.append([(x0,y1),(x0,y2)])

    # write only one file

    cv2.imwrite(f"{folder}/{index}.jpg", img)

    # end of current loop - go back to the beginning to work with next image

Чтобы сделать это более заметным, вы можете создать функцию, которая получает одно имя файла, выполняет все вычисления для одного изображения и сохраняет одно изображение. И запустите эту функцию в for-loop.

import glob
import cv2

def process_one_file(index, file, target_folder):
    print(index, 'file:', file)

    # read only one file

    img = cv2.imread(file)
    print(img)

    # process only one file
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 200, apertureSize=3)
    img_blur = cv2.GaussianBlur(gray, (3, 5), 2)
    edges = cv2.Canny(image=img_blur, threshold1=25, threshold2=50) # Canny Edge Detection

    # Apply HoughLinesP method to 
    # to directly obtain line end points
    lines = cv2.HoughLinesP(
                edges,            # Input edge image
                1,                # Distance resolution in pixels
                np.pi/2,          # Angle resolution in radians
                threshold=225,    # Min number of votes for valid line
                minLineLength=60, # Min allowed length of line
                maxLineGap=400)   # Max allowed gap between line for joining them
           
    # Iterate over points
    lines_list = []
    for points in lines:
        # Extracted points nested in the list
        x0, y1, x0, y2 = points[0]
        
        # Draw the lines joing the points
        # On the original image
        cv2.line(img, (x0, y1), (x0, y2), (0, 255, 0), 4)
        
        # Maintain a simples lookup list for points  ???
        lines_list.append([(x0,y1),(x0,y2)])

    # write only one file

    cv2.imwrite(f"{target_folder}/{index}.jpg", img)

    # exit function
    
# --- main ---    

folder = "opencv/imgs" 
path = f"{folder}/*.*"

for index, file in enumerate(glob.glob(path), 1):
    process_one_file(index, file, folder)
    # end of current loop - go back to the beginning to work with next image

Огромное спасибо, Фурас, ты прав, все мои проблемы были из-за вмятин. Вы действительно мне очень помогли, спасибо за ваше время.

Mark 24.06.2024 02:24

Другие вопросы по теме