Hướng dẫn auto rotate image python - tự động xoay hình ảnh python

Bài viết này ban đầu được xuất bản tại trang web của Thuật toán. Công ty đã được Datarobot mua lại vào năm 2021. Bài viết này có thể không hoàn toàn cập nhật hoặc tham khảo các sản phẩm và dịch vụ không còn tồn tại. Tìm hiểu thêm về Datarobot MLOP tại đây. & NBSP;

Khi chúng ta nhìn vào một hình ảnh, nó khá dễ dàng để phát hiện đường chân trời.

Đối với máy tính, nhiệm vụ này có phần khó khăn hơn: chúng cần hiểu cấu trúc cơ bản của hình ảnh, định vị các cạnh có thể chỉ ra một đường chân trời và sắp xếp các cạnh không quan trọng. May mắn thay, Thuật toán sẽ đưa ra tất cả các cuộc gọi API duy nhất: Chỉ cần gửi hình ảnh của bạn đến & nbsp; Deep Horizon, AN & NBSP; Thuật toán để phát hiện đường chân trời và nó cho bạn biết đường chân trời ở đâu.

Hãy cùng xem cách chúng ta có thể sử dụng công cụ này, kết hợp với & nbsp; Gối & nbsp; (một ngã ba của thư viện hình ảnh Python), để tự động tái hiện bất kỳ hình ảnh nào để nó cấp độ.

Bước 1: Gọi microservice chân trời sâu

Nó chỉ mất một vài dòng mã để gọi bất kỳ thuật toán nào của chúng tôi. Hãy để bọc nó trong một chức năng:

import Algorithmia
def find_horizon(infile):
"""Find the horizon line on an image"""
algo = client.algo('ukyvision/deephorizon/0.1.0')
image = base64.b64encode(open(infile, "rb").read())
return algo.pipe({'image':'data:image/jpg;base64,'+image}).result

Điều này chỉ đơn giản gọi phiên bản 0.1.0 của & nbsp; ukyVision/deephorizon & nbsp; thuật toán, chuyển nó một hình ảnh (sau khi đọc tệp và base64 mã hóa nội dung) và lấy lại kết quả, sẽ có các giá trị ”. Mỗi trong số này là một cặp [x, y] & nbsp; không gian hình ảnh & nbsp; tọa độ, là điểm cuối của đường chân trời.

Nếu chúng tôi đã bỏ qua số phiên bản và đơn giản gọi là client.algo (Hồi UkyVision/Deephorizon,), nó sẽ chạy phiên bản gần đây nhất của thuật toán. Nếu tác giả từng thay đổi API, điều này có thể bị hỏng, vì vậy tốt hơn là luôn bao gồm một số phiên bản cụ thể trong các cuộc gọi thuật toán của bạn.

Cũng lưu ý rằng chúng tôi có tiền tố nội dung hình ảnh với & nbsp; dữ liệu: hình ảnh/jpg; base64, để chỉ ra rằng đó là JPG được mã hóa cơ sở64. Tiền tố này sẽ hơi khác nhau đối với các kiểu / mã hóa khác.

Bước 2: Xác định xoay hình ảnh

Bây giờ chúng ta đã biết các điểm cuối của đường chân trời ở đâu, chúng ta cần tính toán số lượng xoay sẽ cần thiết để tạo mức độ hình ảnh.

import math
def calculate_rotation(coords):
"""Transform coordinates {left: [x1,y1], right: [x2,y2]} to rotation, in degrees """
(x1, y1) = coords['left']
(x2, y2) = coords['right']
slope = (y2-y1)/(x2-x1)
return math.degrees(math.atan(slope))

Từ các lớp toán trung học của chúng tôi, chúng tôi có thể nhớ rằng độ dốc của một đường, tính bằng độ, là & nbsp; nghịch đảo của sự gia tăng được chia cho cuộc chạy.

Nói cách khác, nếu chúng ta có tọa độ [x1, y1] và [x2, y2] của một dòng, thì độ dốc là tan-1 của (y2-y1) / (x2-x1).

Bước 3: Xoay hình ảnh

Gối & nbsp; cung cấp một lệnh một dòng để xoay hình ảnh. Chúng tôi sẽ thêm thư viện bằng PIP:

Pip Cài đặt gối

from PIL import Image
def rotate_image(infile, outfile, degrees, crop):
"""Rotate an image by a number of degrees, crop if desired, and save to outfile"""
Image.open(infile).rotate(degrees, expand=not crop, resample=Image.BILINEAR).save(outfile)

Sau đó, chúng ta có thể tạo một chức năng tiện ích để xoay hình ảnh và lưu nó dưới dạng tệp mới. Gối cũng sẽ tự động cắt hình ảnh, trừ khi chúng tôi vô hiệu hóa điều này với tham số ‘mở rộng. Cuối cùng, chúng tôi sẽ có được chất lượng hình ảnh tốt hơn nếu chúng tôi thêm lấy mẫu song tuyến.

Bước 5: Đặt tất cả lại với nhau

Khi chúng ta có ba chức năng này, việc duỗi thẳng một hình ảnh cũng đơn giản như tìm thấy đường chân trời, tính toán độ dốc và sau đó xoay theo âm của độ dốc đó:

# get your API key at algorithmia.com/user#credentials
client = Algorithmia.client('your_api_key')
infile = "/some/filename.jpg"
outfile = "/some/outputfile.jpg"
line = find_horizon(infile)
rotation = calculate_rotation(line)
rotate_image(infile, outfile, -rotation, True)

Và đó là tất cả những gì chúng ta cần làm. Bây giờ chúng tôi có một tập lệnh, chúng tôi có thể đọc bất kỳ hình ảnh JPG nào, phát hiện đường chân trời và thẳng ra cho bạn trong khi tự động cắt và lấy mẫu lại hình ảnh đầu ra.

Bạn có thể dễ dàng sửa đổi nó để xử lý các kiểu dáng khác, tắt cắt hoặc lấy mẫu lại hoặc rút các tệp từ web.

Công cụ được sử dụng:

Ở đây, toàn bộ kịch bản, sẵn sàng để bạn cắt và dán hoặc lấy nó (và các ví dụ thú vị khác) từ kho lưu trữ ứng dụng mẫu của & NBSP;

import Algorithmia
import base64
import math
from PIL import Image
def find_horizon(infile):
"""Find the horizon line on an image"""
algo = client.algo('ukyvision/deephorizon/0.1.0')
image = base64.b64encode(open(infile, "rb").read())
return algo.pipe({'image':'data:image/jpg;base64,'+image}).result
def calculate_rotation(coords):
"""Transform coordinates {left: [x1,y1], right: [x2,y2]} to rotation, in degrees """
(x1, y1) = coords['left']
(x2, y2) = coords['right']
slope = (y2-y1)/(x2-x1)
return math.degrees(math.atan(slope))
def rotate_image(infile, outfile, degrees, crop):
"""Rotate an image by a number of degrees, crop if desired, and save to outfile"""
Image.open(infile).rotate(degrees, expand=not crop, resample=Image.BILINEAR).save(outfile)
# get your API key at algorithmia.com/user#credentials
client = Algorithmia.client('your_api_key')
infile = "/some/filename.jpg"
outfile = "/some/outputfile.jpg"
line = find_horizon(infile)
rotation = calculate_rotation(line)
rotate_image(infile, outfile, -rotation, True)

Thông tin về các Tác giả

DataRobot

Thế hệ tiếp theo của AI

Datarobot AI Cloud là thế hệ tiếp theo của AI. Nền tảng thống nhất được xây dựng cho tất cả các loại dữ liệu, tất cả người dùng và tất cả các môi trường để cung cấp những hiểu biết kinh doanh quan trọng cho mọi tổ chức. DataRobot được tin tưởng bởi các khách hàng toàn cầu trong các ngành công nghiệp và ngành dọc, bao gồm một phần ba của Fortune 50. Để biết thêm thông tin, hãy truy cập https://www.datarobot.com/.

Gặp gỡ Datarobot