30/09/2018, 17:27

Cách biến đổi các điểm ảnh màu thành điểm ảnh trắng?

Em biến đổi ảnh của em thành ảnh xám như hình, nhưng em muốn loại bỏ các điểm ảnh màu hồng bằng cách biến đổi nó thành các điểm ảnh trắng luôn ! Mong các a giúp đỡ. Đây là code của e google được và đã build thành công ,e dùng visual studio 2010 express.

#include <iostream> 
#include <opencv2opencv.hpp>
#include <opencv2highguihighgui.hpp> 
using namespace std; 
using namespace cv; 
void main() 
{         
    // Load ảnh cần chuyển
    IplImage* img = cvLoadImage("hr45.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);
}  

Còn đây là ảnh gốc và ảnh đã biến đổi

Mr. July viết 19:37 ngày 30/09/2018

// Công thức chuyển anh RGB thành màu GRAY.
graydata[(int)j/3]= (unsigned char) (0.299data[j + 0] + 0.587data[j + 1] + 0.114*data[j+2] + 0.5);

Bạn chú ý vào công thức này, và bạn cần hiểu rõ rằng ảnh màu biến thành ảnh xám dựa vào 1 ngưỡng, giả sử là ngưỡng T, thì cứ điểm ảnh nào cao hơn ngưỡng T biến thành trắng, thấp hơn T sẽ biến thành đen, công thức trên chính là công thức tính ngưỡng, bạn cần biết màu hồng có giá trị bao nhiêu để điều chỉnh cho phù hợp. Cái này bạn tự search rồi thử thay đổi các giá trị trong công thức trên nhé!

Mr. July viết 19:34 ngày 30/09/2018

Tuy nhiên, với mong muốn của bạn thì ảnh xám chưa phải kết quả cuối cùng, vì ảnh xám vẫn là ảnh có đa mức (tức là các điểm ảnh đen tùy mức độ, ko phải chỉ có đen và trắng mà là có đen, đen vừa…). Để có trắng với đen tuyệt đối, bạn tìm hiểu thêm về cách chuyển ảnh RGB sang ảnh nhị phân nhé

Tainguyenpk viết 19:37 ngày 30/09/2018

Cám ơn a Chien ,em biết cốt nằm chủ yếu ngay chỗ dòng lệnh graydata nhưng vấn đề chỗ như a nói e không biết thực hiện cái tính ngưỡng đó như thế nào.A có thể giúp e cụ thể hơn ko ạ ?
Vấn đề thứ 2 e đã chuyển ảnh RGB trực tiếp qua ảnh nhị phân nhưng sao chất lượng ảnh quá xấu như hình .

A cho e hỏi nếu chuyển qua ảnh xám sau khi loại bỏ màu hồng thì chuyển ảnh xám qua ảnh nhị phân chất lượng ảnh sẽ tốt hơn đúng ko ạ ?

Mr. July viết 19:35 ngày 30/09/2018

Cám ơn a Chien ,em biết cốt nằm chủ yếu ngay chỗ dòng lệnh graydata nhưng vấn đề chỗ như a nói e không biết thực hiện cái tính ngưỡng đó như thế nào.A có thể giúp e cụ thể hơn ko ạ ?

Cái này bạn chỉ cần xem trong code là ra thôi mà, chịu khó đọc 1 chút, họ lấy trung bình thôi

A cho e hỏi nếu chuyển qua ảnh xám sau khi loại bỏ màu hồng thì chuyển ảnh xám qua ảnh nhị phân chất lượng ảnh sẽ tốt hơn đúng ko ạ ?

Bạn chuyển trực tiếp sang ảnh nhị phân sẽ bị xấu do ngưỡng của nhị phân rõ ràng hơn, như ảnh kết quả bạn thu được đó, viền các chữ cũng bị nhòe do nó so với ngưỡng, đúng như bạn nói, chuyển qua ảnh xám rồi mới thành nhị phân sẽ cho kết quả tốt hơn vì chúng ta dễ lấy ngưỡng từ ảnh xám hơn là từ ảnh RGB.

Bài liên quan
0