Hướng dẫn resize python - thay đổi kích thước con trăn

Môi trường làm việc với OpenCV

  • Linux [bài viết sử dụng Ubuntu 16.04]
  • OpenCV [bài viết sử dụng OpenCV 3.4.1]
  • Python [bài viết sử dụng Python 3.5.5]
  • Ảnh mẫu để xử lý [bài viết sử dụng ảnh girl_xinh_2.jpg]girl_xinh_2.jpg]

Quan trọng nhất vẫn là có ảnh mẫu để ta xử lý, hehe [keyword tìm kiếm cho ông nào cần ^^: girl xinh, cụ thể là tui lụm từ bài viết kenh24 :P]:girl xinh, cụ thể là tui lụm từ bài viết kenh24 :P]:

girl_xinh_2.jpg

Bạn có thể download ảnh mẫu về.

File hình ảnh và source code python ở cùng thư mục:

  • girl_xinh_2.jpg
  • resize.py

Resize ảnh với OpenCV - Python

Resize, hay gọi cách khác là scale ảnh, là việc ta chỉnh kích thước ảnh về kích thước mới [có thể giữ tỉ lệ ảnh ban đầu hoặc không].scale ảnh, là việc ta chỉnh kích thước ảnh về kích thước mới [có thể giữ tỉ lệ ảnh ban đầu hoặc không].

resize.py: đọc file ảnh lên, resize ảnh [thay đổi kích thước], lưu xuống với OpenCV:: đọc file ảnh lên, resize ảnh [thay đổi kích thước], lưu xuống với OpenCV:

import cv2

IMG_PATH = 'girl_xinh_2.jpg'

# read image
img = cv2.imread[IMG_PATH]
print[IMG_PATH, img.shape]

new_width = 800
new_height = 400
img_resized = cv2.resize[src=img, dsize=[new_width, new_height]]
reisze_img_name = 'girl_xinh_2_%dx%d.jpg' % [new_width, new_height]
cv2.imwrite[reisze_img_name, img_resized]
print[reisze_img_name, img_resized.shape]

fx = 0.5
fy = 1.0
img_resized = cv2.resize[src=img, dsize=None, fx=fx, fy=fy]
reisze_img_name = 'girl_xinh_2_fx=%.1f_fy=%.1f.jpg' % [fx, fy]
cv2.imwrite[reisze_img_name, img_resized]
print[reisze_img_name, img_resized.shape]

print['Done']

Thực thi lệnh trên terminal để đọc ảnh:

$ python resize.py
girl_xinh_2.jpg [720, 960, 3]
girl_xinh_2_800x400.jpg [400, 800, 3]
girl_xinh_2_fx=0.5_fy=1.0.jpg [720, 480, 3]
Done

Script ghi ra 2 ảnh mới:

  • girl_xinh_2_800x400.jpg: giờ thì girl xinh của chúng ta đã bị kéo mặt mập ra rồi, heeh.: giờ thì girl xinh của chúng ta đã bị kéo mặt mập ra rồi, heeh.
  • girl_xinh_2_fx=0.5_fy=1.0.jpg

Giải thích về các tham số resize biến đổi kích thước ảnh OpenCV Python:

  • Lệnh chỉnh kích thước: cv2.resize[]
  • dsize: kích thước mới [width, height]. Tuy tổ chức dữ liệu là Height Width Channel nhưng tham số truyền vào là tuple lại sắp xếp Width trước rồi Height sau. Các bạn chú ý điểm này.
  • fx, fy: dùng để biến đổi theo tỉ lệ ảnh thay vì kích thước tuyệt đối.

Các bạn có thể nghịch với đoạn code bằng cách chỉnh các tham số ^^.

Crop ảnh với OpenCV - Python

crop.py: đọc file ảnh lên, crop vùng ảnh theo trục y [50:400], theo trục x [240:720], lưu xuống với OpenCV:: đọc file ảnh lên, crop vùng ảnh theo trục y [50:400], theo trục x [240:720], lưu xuống với OpenCV:

import cv2

IMG_PATH = 'girl_xinh_2.jpg'

# read image
img = cv2.imread[IMG_PATH]
print[IMG_PATH, img.shape]

img_crop = img[50:400, 240:720, :]
crop_name = 'girl_xinh_2_crop.jpg'
print[crop_name, img_crop.shape]

cv2.imwrite[crop_name, img_crop]
print['Done']

Từ giờ về sau mình sẽ không nhắc đến câu lệnh thực thi code python OpenCV nữa, cú pháp mặc định như mọi lần nhe $ python tên_file.py:

$ python crop.py
girl_xinh_2.jpg [720, 960, 3]
girl_xinh_2_crop.jpg [350, 480, 3]
Done

Sau khi cắt ảnh ra, ta chỉ còn mặt của cô gái. Mà không sao, em ấy vẫn xinh, kaka. :D.

girl_xinh_2_crop.jpg

Padding ảnh với OpenCV - Python

Padding ảnh là gì?

Padding ảnh là việc mà mình thêm các pixel vào các cạnh của ảnh để mở rộng ảnh ra.

Padding ảnh:

  • Thông thường giá trị pixel padding thêm sẽ là zero. Tức có màu đen.
  • Padding sẽ cho hiệu ứng zoom out. Tức nội dung ảnh sẽ nhỏ đi so với toàn ảnh.
  • Bạn có thể tạo hiệu ứng grid bằng cách:
    • Dùng OpenCV padding 1 ảnh to ra 2 lần về bên phải và xuống dưới.
    • Sau đó đọc nội dung 3 ảnh khác bằng OpenCV rồi cắt dán các pixel vào 3 vùng trống vừa mở rộng ra bằng padding.
    • Kết quả cuối cùng cho ảnh grid 2x2.

Nào, ta cùng padding ảnh thôi!

padding.py: padding ảnh thành kích thước 1000x1000: padding ảnh thành kích thước 1000x1000

import cv2
import numpy as np

IMG_PATH = 'girl_xinh_2.jpg'

# read image
img = cv2.imread[IMG_PATH]
print[IMG_PATH, img.shape]  # [720, 960, 3]

img_pad = np.zeros[[1000, 1000, 3]]
img_pad += 100      # grey color BGR: [100, 100, 100]  hex: #646464
img_pad[140:860, 20:980,:] = img

cv2.imwrite['girl_xinh_2_pad.jpg', img_pad]
print['girl_xinh_2_pad.jpg:', img_pad.shape]
print['Done']

Resize ảnh với OpenCV - C++

resize.cpp

#include 
using namespace std;

#include 
#include      // Basic OpenCV structures [cv::Mat]
// using namespace cv;

int main[] {
    cv::Mat img = cv::imread["girl_xinh_2.jpg", cv::IMREAD_COLOR];  // [720, 960, 3]
    cv::Mat img_resize;
    cv::resize[img, img_resize, cv::Size[800,400]];
    cv::imwrite["girl_xinh_800x400.jpg", img_resize];
}

Crop ảnh với OpenCV - C++

crop.cpp

#include 
using namespace std;

#include 
#include      // Basic OpenCV structures [cv::Mat]
// using namespace cv;

int main[] {
    cv::Mat img = cv::imread["girl_xinh_2.jpg", cv::IMREAD_COLOR];  // [720, 960, 3]
    
    int startX=240, startY=50, width=480, height=350;
    cv::Mat ROI[img, cv::Rect[startX, startY, width, height]];

    cv::Mat croppedImage;
    // Copy the data into new matrix
    ROI.copyTo[croppedImage];

    cv::imwrite["girl_xinh_2_crop.jpg", croppedImage];
}

Padding ảnh với OpenCV - C++

padding.cpp

#include 
using namespace std;

#include 
#include      // Basic OpenCV structures [cv::Mat]
// using namespace cv;

int main[] {
    cv::Mat img = cv::imread["girl_xinh_2.jpg", cv::IMREAD_COLOR];  // [720, 960, 3]
        
    int new_height = 1000;
    int new_width = 1000;
    cv::Mat img_pad[new_height, new_width, img.type[]];
    img_pad.setTo[100];
    
    int x = 20;
    int y = 140;
    int width = 980 - x;
    int height = 860 - y;
    img.copyTo[img_pad[cv::Rect[x, y, width, height]]];
    
    cv::imwrite["girl_xinh_2_pad.jpg", img_pad];
}

Cảm ơn bạn đã theo dõi bài viết. Hãy kết nối với tớ nhé!. Hãy kết nối với tớ nhé!

  • Minh: //www.facebook.com/minhng.info
  • Khám phá xử lý ảnh - GVGroup: //www.facebook.com/groups/ip.gvgroup

Khám phá xử lý ảnh - GVGroup

Danh sách bài viết series OpenCV:

  • Hashtag #OpenCV
  • Tut 1: Xử lý ảnh - OpenCV đọc ghi hình ảnh [code Python và C++]
  • Tut 1.1: Xử lý ảnh - Cấu trúc dữ liệu ảnh trong OpenCV. Pixel là gì?
  • Tut 1.2: Xử lý ảnh - Chuyển đổi ảnh OpenCV sang Pillow và ngược lại
  • Tut 2: Xử lý ảnh - OpenCV resize, crop và padding hình ảnh [code Python và C++]
  • Tut 3: Xử lý ảnh - OpenCV biến đổi mức sáng hình ảnh [code Python]
  • Tut 4: Xử lý ảnh - OpenCV vùng quan tâm [ROI] là gì? [code Python]
  • Tut 4.1: Xử lý ảnh - OpenCV: vẽ văn bản, đường thẳng, mũi tên, hình chữ nhật, hình tròn, ellipse, đa giác
  • Tut 4.2: Xử lý ảnh - Pha trộn ảnh trong OpenCV [blending]
  • Tut 5: Xử lý ảnh - OpenCV ảnh nhị phân
  • Tut 6: Xử lý ảnh - OpenCV cân bằng sáng [histogram equalization]
  • Tut 7: Xử lý ảnh - OpenCV kỹ thuật cửa sổ trượt [sliding window]
  • Tut 8: Xử lý ảnh - Convolution là gì?
  • Tut 9: Xử lý ảnh - Làm mờ ảnh [blur]
  • Tut 10: Xử lý ảnh - Gradient của ảnh là gì?
  • Tut 11: Xử lý ảnh - Phát hiện cạnh Canny [Canny Edge Detection]
  • Tut 12: Xử lý ảnh - Phát hiện đường thẳng bằng Hough Transform [Hough Line]
  • Tut 13: Xử lý ảnh - Hiện thực phát hiện đoạn thẳng dùng Hough Transform [Hough Line]
  • Tut 14: Xử lý ảnh - Giải thuật phân vùng Region Growing trên ảnh màu
  • Tut 15: Xử lý ảnh - Giải thuật Background Subtraction trên ảnh màu
  • Tut 16: Xử lý ảnh - Frame Subtraction để phát hiện chuyển động trong video
  • Tut 17: Xử lý ảnh - HOG - Histograms of Oriented Gradients
  • Tut 18: Xử lý ảnh - HOG - Huấn luyện mô hình phân loại người
  • Tut 19: Xử lý ảnh - HOG - Phát hiện người
  • Tut 20: Xử lý ảnh - Tổng hợp kinh nghiệm xử lý ảnh [End]
  • Tut 21: Xử lý ảnh - Hiện thực trích đặc trưng Local Binary Patterns [LBP]
  • Tut 22: Xử lý ảnh - Trích đặc trưng Gabor filters

Bài Viết Liên Quan

Chủ Đề