Liệt kê tất cả các tệp png trong một thư mục python
Đây là tập lệnh đầy đủ để tải tất cả các PNG trong một thư mục nhất định, chuyển đổi chúng thành TIFF thang độ xám 8 bit, sau đó lưu chúng vào một thư mục khác.
import os
from skimage import io
from skimage.util import img_as_ubyte
# You need to change these to valid directories on your computer
input_dir = os.path.dirname('C:/FILES/leaves/')
output_dir = os.path.dirname('C:/FILES/leaves converted/')
for f in os.listdir(input_dir):
if f.lower().endswith('.png') is True:
image_gray = io.imread(os.path.join(input_dir, f),
as_gray=True)
image_gray = img_as_ubyte(image_gray)
output_file = f.replace('.png', '_gray.tiff')
io.imsave(os.path.join(output_dir, output_file), image_gray)
Show
Bạn cũng có thể truy cập tập lệnh này trên GitHub của chúng tôi từng dòngHãy nhập chức năng chúng ta sẽ cần import os
from skimage import io
from skimage.util import img_as_ubyte Hãy đặt đường dẫn đến thư mục tệp đầu vào và đầu ra mà chúng tôi đang sử dụng làm biến để dễ dàng truy cập. Các tệp đầu vào của tôi nằm trong một thư mục tại C. /FILES/leaves/ và tôi có một thư mục trống tại C. /FILES/lá đã chuyển đổi/ cho đầu ra. Mô hình con giúp đảm bảo rằng mã hoạt động với các đường dẫn sẽ hoạt động trên các hệ điều hành khác nhau, trong đó các ký tự khác nhau có thể được sử dụng để phân tách các bộ mô tả đường dẫn. Ở đây chúng tôi sử dụng để thiết lập các thư mục đầu vào và đầu ra dưới dạng biến # You need to change these to valid directories on your computer
input_dir = os.path.dirname('C:/FILES/leaves/')
output_dir = os.path.dirname('C:/FILES/leaves converted/') Chúng tôi cần lặp qua tất cả các tệp trong thư mục đầu vào để thực hiện thao tác của mình. Mô-đun os có một hàm tiện lợi, trả về danh sách tất cả các tệp và thư mục con trong thư mục đã cho. Hãy làm điều này ngay bây giờ và gọi tất cả các phần tử trong danh sách đó là f for f in os.listdir(input_dir): Trong trường hợp của tôi, tôi muốn giới hạn thực hiện thao tác này chỉ trên các PNG trong thư mục đầu vào của mình. Hàm if này giới hạn mã nào được thực thi chỉ với các tệp PNG if f.lower().endswith('.png') is True: Hai phương thức chuỗi được sử dụng trên mỗi tên tệp f thực hiện như sau
Tiếp theo, chúng tôi mở từng hình ảnh PNG trong thư mục bằng cách sử dụng imread của scikit-image với tham số as_gray được đặt thành True, sau đó đảm bảo mảng được trả về được chia tỷ lệ và chuyển đổi thành 8 bit bằng cách sử dụng img_as_ubyte từ cùng một gói. Điều này đã được trình bày trong Python Quick Tip 1 image_gray = io.imread(os.path.join(input_dir, f),
as_gray=True)
image_gray = img_as_ubyte(image_gray) Điểm mới ở đây là chức năng từ hệ điều hành. mô hình con đường dẫn. Chúng tôi cung cấp đường dẫn đến một thư mục và tên tệp làm đối số để nối và nó sẽ nối chúng một cách “thông minh” Tiếp theo là một thủ thuật tôi luôn sử dụng khi thực hiện chuyển đổi tệp. Trước khi lưu, hãy tạo tên tệp đầu ra phụ thuộc vào tên tệp đầu vào. Phương thức thay thế sẽ chèn một chuỗi con mới vào vị trí của chuỗi con mà bạn cung cấp. Vì mã này chỉ hoạt động trên PNG, nên chúng tôi chỉ cần thay thế tiện ích mở rộng đó bằng một bộ mô tả, cộng với tiện ích mở rộng mà chúng tôi muốn lưu vào output_file = f.replace('.png', '_gray.tiff') Cuối cùng, chúng tôi lưu hình ảnh đã chuyển đổi dưới dạng TIFF trong thư mục đầu ra của mình, sử dụng os. đường dẫn. tham gia giống như chúng tôi đã làm để mở hình ảnh gốc io.imsave(os.path.join(output_dir, output_file), image_gray) Hãy thử điều chỉnh mã này để chạy cho hình ảnh của riêng bạn và cho chúng tôi biết nó hoạt động như thế nào trên Diễn đàn Aivia Suy nghĩ bổ sungTất nhiên, chức năng listdir không phải là cách duy nhất để lấy danh sách tệp. Ví dụ, hệ điều hành. walk hiệu quả hơn nhiều khi tìm kiếm thông qua các thư mục con, mặc dù bạn có thể thấy việc giải nén những gì nó trả về hơi khó hiểu hơn listdir. Xem thêm tại đây Điều gì sẽ xảy ra nếu bạn cần loại trừ một số tệp nhất định khỏi tìm kiếm của mình tùy thuộc vào nhiều thứ hơn là chỉ phần mở rộng tệp? . Bạn chỉ muốn thực hiện một số tiền xử lý trên hình ảnh 3D. Nếu bạn chỉ sử dụng TIFF, thư mục của bạn có thể trông như thế này Xử lý trước hỗn hợp các tệp 3D và 2D này bằng cùng một thuật toán không thực sự có ý nghĩa. Bạn có thể thêm một số logic kiểm tra hình dạng của từng mảng sau khi nó tải và bỏ qua hình ảnh 2D, nhưng điều này có nghĩa là tập lệnh của bạn lãng phí thời gian tải những hình ảnh 2D đó vào bộ nhớ. Đối với hàng trăm (hoặc hàng nghìn) hoạt động đó, đây có thể là một sự lãng phí đáng kể về thời gian xử lý. Sẽ hợp lý hơn nếu chỉ tải các tệp 3D. Nhập toàn cầu. Điều này xây dựng một danh sách các tệp trong một thư mục khớp với một mẫu chuỗi nhất định và thậm chí nó có thể được đệ quy Việc sử dụng rộng rãi gói os khi xử lý đường dẫn tệp (os. đường dẫn. dirname, hệ điều hành. listdir, hệ điều hành. đường dẫn. tham gia, v.v. ) khiến tôi bối rối khi lần đầu học Python. Sử dụng các chuỗi đơn giản cho những thứ như đường dẫn tệp đầy đủ sẽ đơn giản hơn. Nhưng nếu bây giờ bạn có thói quen xử lý đường dẫn tệp của mình bằng các chức năng này, thì mã của bạn sẽ ít phụ thuộc vào hệ điều hành hơn, dễ chia sẻ hơn với đồng nghiệp và có nhiều khả năng chạy trong tương lai nếu bạn thay đổi môi trường phát triển của mình Trong bối cảnh của AiviaSẽ không hợp lý khi sử dụng thủ thuật này trực tiếp trong ngữ cảnh của Aivia vì Aivia xử lý tệp IO bằng cơ chế riêng của mình để liên kết Python với các kênh và các bước thời gian. Tuy nhiên, chúng tôi có một tập lệnh tiện ích lặp qua một thư mục chứa các tệp DICOM và kết hợp chúng thành một TIFF 3D duy nhất file_list = [f for f in os.listdir(dicom_directory) if 'dcm' in f.lower() or 'dicom' in f.lower()] Việc hiểu danh sách này là một ví dụ điển hình khi "Pythonic" đi hơi xa. Hãy giải mã nó một chút
|