Trước tiên tôi muốn chuyển đổi hình ảnh gốc [trong đó hình dạng và dtype là
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
9] thành mảng 1D để tôi có thể nhập mảng 1D đó vào tập huấn luyện làm một quan sát.Bây giờ tôi muốn chuyển đổi mảng 1D đó thành dạng ban đầu.
Để chuyển đổi hình ảnh gốc thành mảng 1D, tôi đã sử dụng hàm
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
0 có sẵn trong Numpy. Dưới đây là mã:In[80]: t = misc.imread['b.png'] #to read the image
In[81]: t.shape, t.dtype
Out[81]: [[1024, 1024, 3], dtype['uint8']]
#To convert the above image into 1D array
In[82]: t.flatten[]
Out[82]: array[[ 5, 40, 121, ..., 130, 110, 89], dtype=uint8]
Bây giờ tôi muốn chuyển đổi ma trận trên [kết quả từ
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
1] thành ma trận gốc [tức là # create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
2 trong hình dạng].
Xin vui lòng cho tôi biết tôi nên làm gì.
Cập nhật: Tôi đã kiểm tra hình dạng của
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
3 và nó xuất hiệnIn[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
Nhưng 6291456 = [1024*1024*3*2]. Bây giờ tôi bối rối rằng từ đâu trong thời hạn thêm này [tức là 2] xuất hiện.2]. Now I am confused that from where does this extra term[i.e 2] comes out.
Tôi cũng đã sử dụng lệnh định hình lại nhưng lỗi xuất hiện khi tôi thực thi lệnh.
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
Resizing Images là một phần không thể thiếu của web, cho dù hiển thị hình ảnh trên trang web hoặc ứng dụng của bạn, lưu trữ hình ảnh độ phân giải thấp hơn hoặc tạo bộ đào tạo cho các mạng thần kinh. Python cung cấp một bộ tùy chọn phong phú để thực hiện một số tác vụ thay đổi kích thước hình ảnh thường xuyên. Bài viết này sẽ hướng dẫn bạn qua các tùy chọn đó và xem ImageKit-một giải pháp sẵn sàng, dựa trên đám mây, cung cấp thao tác hình ảnh thời gian thực. Chúng tôi sẽ xem xét Hãy chắc chắn rằng bạn có một phiên bản Python gần đây được cài đặt trên hệ thống của bạn, tốt nhất là Python 3.6+, sau đó quay một môi trường ảo. Khi chúng tôi đến ImageKit sau trong bài viết này, bạn sẽ cần đăng ký tài khoản miễn phí trên trang web của ImageKit. Kế hoạch miễn phí có quyền truy cập vào tất cả các tính năng chúng tôi cần để thay đổi kích thước hình ảnh và các phép biến đổi khác. Chúng tôi sẽ sử dụng một hình ảnh của Asad từ Pexels cho tất cả các ví dụ trong bài viết này. Hình ảnh này cũng được lưu trữ trên ImageKit. Gối là một trong những lựa chọn phổ biến nhất để thực hiện các nhiệm vụ thao tác hình ảnh cơ bản như cắt xén, thay đổi kích thước hoặc thêm hình mờ. Cài đặt phiên bản mới nhất của Gối với Trước khi chúng tôi bắt đầu
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
Thay đổi kích thước hình ảnh bằng gối [PIL]
4.# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
Python3 -m pip install Pillow
Gối cung cấp phương thức Resize [], lấy một bộ [chiều rộng, chiều cao] làm đối số.
from PIL import Image
image = Image.open['sunset.jpg']
print[f"Original size : {image.size}"] # 5464x3640
sunset_resized = image.resize[[400, 400]]
sunset_resized.save['sunset_400.jpeg']
Chúng tôi đọc hình ảnh của chúng tôi bằng phương pháp
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
5 từ mô -đun hình ảnh. Sau đó, chúng tôi sử dụng # create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
6 với một tuple, đại diện cho chiều rộng và chiều cao của hình ảnh đầu ra, tương ứng, như một đối số chứa kích thước mới.Đây là cách hình ảnh kích thước của chúng tôi trông như thế nào
Duy trì tỷ lệ khung hình trong khi thay đổi kích thước
Phương pháp
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
6 khá tiện dụng và nhanh chóng để làm việc, nhưng nó không phải lúc nào cũng cho kết quả tốt nhất. Hình ảnh được thay đổi kích thước bằng phương pháp này có thể được kéo dài hoặc buộc phải lắp trong hộp và do đó bị sai lệch.ImageKit làm cho nó dễ dàng thay đổi kích thước hình ảnh một cách lố bịch trong khi duy trì & nbsp; tỷ lệ khung hình. Xem cách ImageKit hoạt động để thay đổi kích thước.
Mặc dù phương pháp
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
8 có thể giải quyết vấn đề sai lệch, nhưng nó tạo ra phiên bản hình thu nhỏ của hình ảnh có kích thước không vượt quá các kích thước được chỉ định trong các đối số.image.thumbnail[[400, 400]]image.save["sunset-aspect.jpeg"]
Phương thức hình thu nhỏ thay đổi kích thước hình ảnh tại chỗ mà không trả lại một đối tượng hình ảnh. Do đó, hãy đảm bảo lưu tệp với một tên khác.
Cắt một hình ảnh với gối
Phương pháp
# create virtual env
Python3 -m venv image-resize
# activate
source image-resize/bin/activate
9 được sử dụng để cắt hình ảnh chấp nhận 4-Tuple của tọa độ X và Y của góc trên bên trái và góc dưới bên phải của khu vực cây trồng.Vì vậy, nếu chúng ta muốn cắt một hình ảnh từ điểm [300.300] xuống [700.900] điểm, mã sẽ là
# Crop the image
box = [300, 300, 700, 900]
cropped_image = image.crop[box]
cropped_image.save['cropped-image.jpg']
# 400x600 size of the image
print[cropped_image.size]
Có một phương pháp dễ dàng hơn để sử dụng //ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
0. Phương thức //ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
1 chấp nhận hai đối số:There is an easier method of using
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
0. The //ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
1 method accepts two arguments:
2 - Hình ảnh để cắt//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
3 - chiều rộng của khu vực cần gỡ bỏ. Chiều rộng giống nhau được loại bỏ khỏi cả bốn mặt của hình ảnh.//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
from PIL import Image, ImageOps
image = Image.open['sunset.jpg']
cropped = ImageOps.crop[image, 600]
cropped.save["crop-imageops-600.jpg"]
Dưới đây là hình ảnh mẫu của chúng tôi được cắt bằng 600px từ tất cả các phía.
Bạn nên kiểm tra Sổ tay gối để biết các hoạt động hình ảnh phức tạp hơn.pillow handbook for more complex image operations.
Phần thưởng: Thêm hình mờ vào hình ảnh
Để thêm hình mờ, chúng ta cần sử dụng các phương pháp FenseDraw và ImageFont. Mô-đun ImageDraw cung cấp API sử dụng đơn giản để làm việc với đồ họa 2D, từ tạo đa giác đến viết văn bản. ImageFont đặt phông chữ của văn bản Watermark.
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
0Hãy chắc chắn chọn một phông chữ có sẵn trên hệ thống của bạn. Bạn có thể đặt vị trí, điền, neo hoặc ngôn ngữ. Bạn cũng có thể tải xuống một phông chữ bạn chọn và cung cấp đường dẫn đến nó.
Đây là đầu ra mẫu -
Thay đổi kích thước hình ảnh bằng OpenCV
OpenCV là thư viện de-facto được sử dụng để thực hiện các tác vụ xử lý hình ảnh phức tạp như phát hiện khuôn mặt, biến đổi pixel và mô hình 3D. Nhưng, nó có thể thực hiện các nhiệm vụ chung hơn như thay đổi kích thước hình ảnh.
Đầu tiên, chúng ta hãy cài đặt OpenCV mới nhất cho Python bằng PIP.
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
1Lưu ý rằng chúng tôi đang sử dụng OpenCV 4.5 cho hướng dẫn này.
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
4 là tên của trình bao bọc Python.Thay đổi kích thước với opencv
Mặc dù OpenCV là một lựa chọn khả thi để thay đổi kích thước hình ảnh, nhưng nó phù hợp nhất cho các nhiệm vụ hạng nặng như phát hiện đối tượng. Bám sát gối để thao tác hình ảnh cơ bản hoặc cuộn bên dưới để xem ImageKit làm điều đó như thế nào.
Thay đổi kích thước hình ảnh có thể được thực hiện bằng phương pháp
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
5.In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
2Cắt một hình ảnh với opencv
OpenCV sử dụng một mảng numpy dưới mui xe để thể hiện hình ảnh. Chúng ta có thể tận dụng việc cắt mảng để trích xuất một phần của pixel chúng ta cần, tức là, cắt hình ảnh.
Vì đây là một mảng 2D, chúng tôi cần chỉ định tọa độ bắt đầu và kết thúc, giống như chúng tôi đã làm trong khi cắt hình ảnh bằng gối. Mặc dù, cú pháp ở đây hơi khác nhau.
Nếu chúng ta muốn cắt một hình ảnh bắt đầu từ [0,0] điểm đến [2732, 3640], thì chúng ta có thể làm điều này với OpenCV như hình dưới đây
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
3Bạn có thể đọc thêm về hướng dẫn xử lý hình ảnh từ OpenCV.image processing tutorials from OpenCV.
Sử dụng ImageKit để thay đổi kích thước và cắt hình ảnh
Cả Gối và OpenCV là những lựa chọn tốt để thay đổi kích thước và cắt hình ảnh. Nhưng các giải pháp này yêu cầu thiết lập và bảo trì rộng rãi phù hợp với nhu cầu kinh doanh thay đổi.
Đây có thể không phải là việc sử dụng tốt nhất thời gian của nhóm hoặc nhóm của bạn khi các công cụ như ImageKit.io có thể thực hiện cùng một công việc cho bạn với nỗ lực tối thiểu.
ImageKit.io là một sản phẩm tối ưu hóa, thao tác và lưu trữ hình ảnh và video thời gian thực có thể giúp bạn thực hiện thay đổi kích thước cơ bản và cắt xén hình ảnh của bạn và hơn thế nữa.
Bạn có tính linh hoạt để tải hình ảnh của mình lên thư viện phương tiện tích hợp hoặc đính kèm lưu trữ đám mây hoặc máy chủ hiện tại của bạn vào ImageKit và bắt đầu cung cấp các tệp được tối ưu hóa. Một số tối ưu hóa hình ảnh và video được thực hiện tự động, xem xét nhiều yếu tố, trong khi thay đổi kích thước, cắt xén và các phép biến đổi khác có thể được thực hiện bằng cách sửa đổi URL trong thời gian thực.
Thiết lập với ImageKit
Trong ví dụ của chúng tôi, chúng tôi đã tải hình ảnh mẫu lên ImageKit.
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
Bạn nên đăng ký một tài khoản miễn phí trên ImageKit đi kèm với số lượng lớn băng thông lưu trữ và phân phối. Bạn có thể tải xuống hình ảnh gốc từ các pexels từ đây và tải nó lên thư viện phương tiện của bạn.
Chúng tôi sẽ sử dụng SDK Python của ImageKit để tạo các URL hình ảnh được thay đổi kích thước và cắt. Bạn có thể cài đặt SDK này bằng lệnh sau -
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
5Thay đổi kích thước cơ bản bằng cách thay đổi chiều cao và chiều rộng
Thay đổi kích thước hình ảnh trong ImageKit là đơn giản. Chỉ cần thêm chuyển đổi kích thước cần thiết vào URL và bạn sẽ nhận được hình ảnh thay đổi kích thước trong thời gian thực.
Ví dụ: để có được hình ảnh mẫu có chiều rộng 200px, URL sẽ là -
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
6Image được thay đổi kích thước theo chiều rộng 200px bằng các tham số chuyển đổi dựa trên URLMặc dù đây là một hoạt động nối chuỗi đơn giản, SDK Python làm cho mã đơn giản và có thể đọc được hơn.
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
7Ex ví dụ về việc tạo URL ở chiều rộng 200px với SDK PythonTương tự, nếu chúng ta muốn nhận hình ảnh được thay đổi kích thước 400 x 300px từ ImageKit, URL sẽ chứa các tham số chuyển đổi chiều cao và chiều rộng.
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
8Mã tương ứng với SDK Python sẽ
In[86]: p=t.flatten[]
In[87]: p.shape
Out[86]:[6291456,]
9Có một số tùy chọn chuyển đổi hình ảnh khác với ImageKit. Bạn có thể đọc về chúng từ tài liệu sản phẩm hoặc từ tài liệu SDK Python.
Hình ảnh cắt xén với tỷ lệ khung hình cụ thể
Một chuyển đổi khác có sẵn trong ImageKit là chuyển đổi tỷ lệ khung hình. Bạn có thể sử dụng nó với độ rộng hoặc biến đổi chiều cao để sửa lỗi và biến đổi khung hình của hình ảnh đầu ra.
Ví dụ: để có được một hình ảnh ở chiều rộng 800px với tỷ lệ khung hình 4: 3, URL sẽ
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
0Các tùy chọn cắt xén có sẵn với ImageKit
Trong các ví dụ trên, nếu tỷ lệ khung hình đầu ra không khớp với tỷ lệ khung hình đầu vào, hình ảnh sẽ bị cắt xung quanh trung tâm của bản gốc theo mặc định.
Tuy nhiên, ImageKit cung cấp cho chúng tôi nhiều tùy chọn cắt xén có thể ngăn chặn việc cắt xén hình ảnh và giúp chúng tôi có được đầu ra cần thiết. Hãy xem xét một số tùy chọn cắt xén tiêu chuẩn dưới đây.
1. Không cắt xén - Buộc kích thước được yêu cầu
Bạn có thể làm điều này bằng cách thêm tham số chuyển đổi
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
6 vào URL. Điều này sẽ buộc phù hợp với hình ảnh theo kích thước được yêu cầu. Mặc dù, vì đây là một lực phù hợp, nó có thể khiến hình ảnh bị sai lệch.l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
1 Hình ảnh phù hợp với kích thước 400x200pxTrong SDK Python, điều này có thể được chỉ định bằng cách sử dụng chuyển đổi
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
7l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
22. Lắp bên trong một thùng chứa
Chiến lược cây trồng
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
8 phù hợp với hình ảnh bên trong một thùng chứa có chiều cao và chiều rộng xác định trong khi bảo tồn tỷ lệ khung hình. Chiều cao hoặc chiều rộng của hình ảnh có thể khác với kích thước được yêu cầu và hình ảnh kết quả sẽ luôn nhỏ hơn các kích thước được chỉ định.l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
3 Hình ảnh phù hợp bên trong hộp 400x200px3. Lắp bên ngoài một thùng chứa
Đối diện với cây trồng
//ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
8, cây trồng Python3 -m pip install Pillow
0 dẫn đến một hình ảnh ít nhất là kích thước được chỉ định bằng cách sử dụng kích thước chiều cao và chiều rộng. Chiều cao hoặc chiều rộng của hình ảnh có thể khác với kích thước được yêu cầu và hình ảnh kết quả sẽ luôn lớn hơn các kích thước được chỉ định.l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
4 Hình ảnh kết quả lớn hơn kích thước 400x200px được chỉ định4. Pad một hình ảnh
Nếu bạn vẫn muốn hình ảnh kết quả phù hợp với kích thước đầu ra được yêu cầu nhưng không được cắt, bạn có thể sử dụng chế độ cây trồng
Python3 -m pip install Pillow
1. Lưu ý rằng điều này khác với các phép biến đổi //ik.imagekit.io/ikmedia/python-resizing/sunset_SLoRHsWVo.jpg
7 được sử dụng ở trên và được chỉ định bằng cách sử dụng chuyển đổi Python3 -m pip install Pillow
3. Bạn cũng có thể chỉ định màu đệm được thêm vào xung quanh hình ảnh bằng cách sử dụng chuyển đổi nền.l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
5URL kết quả là
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
6Image với phần đệm sử dụng URL một tham sốBạn có thể thấy phần đệm màu xám xung quanh hình ảnh, hoàn toàn phù hợp với kích thước đầu ra 400 x 200px mà không cần cắt hình ảnh.
Phần thưởng: Thêm hình mờ vào hình ảnh bằng ImageKit
ImageKit cung cấp hơn 40 tham số chuyển đổi thời gian thực khác nhau cho hình ảnh.
Chúng tôi có thể sử dụng chúng để thêm cả lớp phủ hình ảnh và văn bản vào hình ảnh của chúng tôi và kiểm soát cách thức và nơi chúng được hiển thị trên hình ảnh của chúng tôi. Bạn có thể tham khảo tài liệu hoàn chỉnh Overlay ở đây.
Chúng ta hãy xem một ví dụ để thêm văn bản trên hình ảnh ở góc trên cùng bên trái của hình ảnh cơ sở của chúng tôi. Ở đây chúng tôi chỉ định văn bản, kích thước phông chữ của nó và màu phông chữ trong chính URL.
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
7URL hình ảnh kết quả là
l=p.reshape[1024,1024,3]
---------------------------------------------------------------------------
ValueError Traceback [most recent call last]
in []
----> 1 l=p.reshape[1024,1024,3]
ValueError: total size of new array must be unchanged
8Adding Watermark cho hình ảnh với tham số URL & NBSP;
Tương tự, chúng ta có thể thêm hình mờ hình ảnh hoặc kết hợp nhiều hình mờ ở các vị trí và kích thước khác nhau trên một hình ảnh trong thời gian thực. Bạn sẽ tìm thấy các ví dụ như vậy trong tài liệu cho lớp phủ và các phép biến đổi xích.
Sự kết luận
Đây là một bản tóm tắt nhanh chóng về những gì chúng ta đã học được ngày hôm nay. Chúng tôi đã xem xét ba cách khác nhau để thay đổi kích thước hình ảnh trong Python.
- Gối cung cấp các phương pháp dễ sử dụng và có thể sử dụng để thực hiện các tác vụ thao tác hình ảnh cơ bản. Cẩm nang gối chứa các ví dụ về các hoạt động khác nhau mà bạn có thể thực hiện trên hình ảnh.
- OpenCV cũng có thể thay đổi kích thước hình ảnh bằng tiện ích cv2.resize [], nhưng nó thường chậm hơn so với các phương thức có sẵn khác.
- ImageKit là dịch vụ chuyển đổi hình ảnh dựa trên đám mây của bên thứ ba mà bạn có thể sử dụng để thao tác với hình ảnh theo quy mô bằng các tham số chuyển đổi dựa trên URL.
Đăng ký ngay bây giờ để có kế hoạch miễn phí mãi mãi của ImageKit và bắt đầu thay đổi kích thước hình ảnh trong thời gian thực với nỗ lực tối thiểu.