Trộn ảnh
Computer Vision
14
White

Ngoc Dao viết ngày 20/03/2016

Trộn ảnh là hiệu ứng rất bắt mắt, nhưng lại rất dễ thực hiện. Ảnh dưới là Baboon và Lenna trộn với nhau, trông rất ấn tượng, có thể mang đi quảng cáo phim King Kong phải không ạ!

Blend

Nếu biết cách trộn 2 pixel, ta sẽ biết cách trộn 2 ảnh. Đối với ảnh grayscale, công thức để trộn 2 pixel như sau:

i = r*i1 + (1 - r)*i2

Trong đó i1 và i2 là độ xám (intensity) của 2 pixel, r là số từ 0 đến 1. Mở rộng công thức này, ta có thể trộn ảnh màu, thậm chí 3, 4 ảnh với nhau.

Dưới đây là chương trình mẫu, sử dụng thư viện OpenCV.

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

#define FILE_NAME1  "baboon.jpg"
#define FILE_NAME2  "lenna.jpg"
#define WINDOW_NAME "Output"

IplImage *img1, *img2, *blended;

void trackbarHandler(int pos);

int main() {
  img1 = cvLoadImage(FILE_NAME1);
  if (!img1) {
    printf("Cannot open %s\n", FILE_NAME1);
    return -1;
  }

  img2 = cvLoadImage(FILE_NAME2);
  if (!img2) {
    cvReleaseImage(&img1);
    printf("Cannot open %s\n", FILE_NAME2);
    return -1;
  }

  // The two images should have the same properties
  if (img1->width != img2->width ||
      img1->height != img2->height ||
      img1->nChannels != img2->nChannels) {
    cvReleaseImage(&img1);
    cvReleaseImage(&img2);
    printf("The two images should have the same properties\n");
    return -1;
  }

  blended = cvCreateImage(
    cvSize(img1->width, img1->height),
    img1->depth, img1->nChannels
  );

  cvNamedWindow(WINDOW_NAME);
  int blendRatio = 50;  // 0 - 100 [%]
  cvCreateTrackbar("Ratio", WINDOW_NAME, &blendRatio, 100, trackbarHandler);

  trackbarHandler(blendRatio);

  cvWaitKey();
  cvReleaseImage(&img1);
  cvReleaseImage(&img2);
  cvReleaseImage(&blended);
}

void trackbarHandler(int pos) {
  int width    = img1->width;
  int height   = img1->height;
  int step     = img1->widthStep/(img1->depth/8);
  int channels = img1->nChannels;

  uchar* data1 = (uchar *)img1->imageData;
  uchar* data2 = (uchar *)img2->imageData;
  uchar* dataB = (uchar *)blended->imageData;

  for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
      for (int k = 0; k < channels; k++) {
        int e = i*step + j*channels + k;
        double r = pos/100.0;  // Ratio, 0.0 - 1.0
        dataB[e] = r*data1[e] + (1 - r)*data2[e];
      }
    }
  }

  cvShowImage(WINDOW_NAME, blended);
}

Có thể sửa đổi một chút để thực hiện hiệu ứng hiện ảnh ra dần dần (fade in, thường từ màu đen) hoặc làm ảnh biến mất dần dần (fade out, thường thành màu đen).

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
369 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
76 8
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết gần 5 năm trước
76 8
White
47 1
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết hơn 4 năm trước
47 1
White
45 3
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết hơn 4 năm trước
45 3
Bài viết liên quan
White
1 2
Kĩ thuật chụp ảnh ra đời từ khoảng 2 thế kỉ trước. Nếu để ý, sẽ thấy tất cả ảnh giấy tồn tại được cho đến ngày nay đều là ảnh sepia. Sepia là từ ti...
Ngoc Dao viết hơn 4 năm trước
1 2
White
0 0
Opencv (Open Computer Vision Library) là một thư viện chuyên biệt dành cho xử lý ảnh. Với các bạn mới bắt đầu thì việc cài đặt nó khá đơn giản có t...
hanhbd viết 6 tháng trước
0 0
White
0 1
Có ảnh mẫu của một vật thể (ví dụ: ô tô), và ảnh thật chứa một vài vật thể ấy (ví dụ: các ô tô trong bãi đỗ xe). Làm sao để nhận dạng được vị trí c...
Ngoc Dao viết hơn 4 năm trước
0 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
369 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!