Mar 13, 2012

Chuyển ảnh màu sang ảnh xám

image

Tạo 1 project Win32 console và chép code sau:

#include <iostream> 
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp> 
using namespace std; 
using namespace cv; 
void main() 
{         
    // Load ảnh cần chuyển
    IplImage* img = cvLoadImage("pic1.jpg",1);
    // Tạo một biến mới để chuyển ảnh màu thành xem
    // cvGetSize(img) : lấy thông tin kích thước của img, IPL_DEPTH_8U là chuẩn màu của hình.
    IplImage* grayimg = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1);
    // Lấy thông tin chiều dài, rộng, số kênh màu, widthStep,
    int nl= img->height;
    int nc= img->width * img->nChannels;
    int step= img->widthStep;  
    int graystep = grayimg->widthStep;
    // img -> imageData: mảng chứa các mã màu của img
    uchar *data= (uchar *)img->imageData;
    uchar *graydata= (uchar *)grayimg->imageData;
 
    for (int i=0; i < nl; i++) {
       for (int j=0; j < nc; j += img->nChannels) {
        // Công thức chuyển anh RGB thành màu GRAY.
           graydata[(int)j/3]=  (unsigned char) (0.299*data[j + 0] + 0.587*data[j + 1] + 0.114*data[j+2] + 0.5);
        }
            data+= step;
            graydata+=graystep;
    }
    // Mở và hiển thị ảnh vừa chuyển
    cvNamedWindow("Xam",0);
    cvShowImage("Xam",grayimg);
    waitKey(0);
    // Giải phóng vùng nhớ
    cvDestroyWindow("Xam");
    cvReleaseImage(&img);
    cvReleaseImage(&grayimg);
}  

8 comments:

  1. thanks bài viết rất hữu ích

    ReplyDelete
  2. Em mới học môn xử ảnh, thầy cho bài tập kêu giãn độ tương phản cưa 1 ảnh. có 2 cách.
    cách 1: áp dụng công thức J(i.j)= c+ I(i,j)*(d-c)/(b-a), voi a=0, b=255, c< d, c,d la cac gia tri minh nhap vo, em da lam duoc phan nay.
    - cách 2: Ap dung cai tien1: chọn a là gía trị độ xám mà tại đó 5% tổng sô điểm ảnh có giá trị nhỏ hơn a, chọn b là gía trị độ xám mà tại đó 5% tổng sô điểm ảnh có giá trị lớn hơn a. Em không làm được cách 2, mong anh chỉ giúp dùm em, mấy bữa nữa em phải nộp bài rồi. hix.(Thầy có hướng dẫn vẽ histogram xong roi tinh). Em sử dụng thư viện 0penCV2.Mong anh giúp đỡ. Có gì anh liên hệ qua mail t_hien94@yahoo.com cho em nha. thanks nhièu

    ReplyDelete
    Replies
    1. Mình đoán là bạn đang gặp khó khăn về cài đặt histogram trong OpenCV (vì nếu đã cài đặt được rồi thì việc tìm a, b khá là dễ).
      Đây là 1 tutorial nhỏ mình viết, hi vọng qua đó bạn sẽ cài đặt được:
      http://www.mediafire.com/view/?9kzi309ex7mo42s

      Delete
  3. This comment has been removed by the author.

    ReplyDelete
  4. bạn cho mình hỏi, ý nghĩa của các số: 0.299,0.587,0.114 là gì. mình biết nó là công thức, bạn có thể cho mình nguồn của công thức đó đc k

    ReplyDelete
    Replies
    1. Chào bạn, nó đây:
      http://www.cacs.louisiana.edu/~cice/lal/index.html :D

      Delete
  5. This comment has been removed by the author.

    ReplyDelete
  6. Anonymous23/4/13 23:50

    Cảm ơn bạn nha! Blog hay quá!

    ReplyDelete