Chuyển ảnh jpeg thành mảng nhị phân

Em muốn chuyển ảnh JPEG thành mảng nhị phân với mỗi điểm ảnh màu đen là đại diện số 1 ,điểm ảnh trắng là số 0 .Các a giúp e với, do em mới làm quen với code nên ko biết bắt đầu từ đâu ?

1 Like

em dùng ngôn ngữ lập trình nào để làm việc này ?

Dạ em dùng C++ ,em đang xài microsoft visual c++ express .

đây là file ảnh của em ak a quân .

Bạn xem cấu trúc của file JPEG và xem nó mã hóa theo kiểu nào từ đó xem các pixel màu mã hóa thế nào. Còn màu khác thì mã hóa như thế nào, chưa rõ lắm?

Ảnh này là ảnh đen trắng mà nó chỉ có nền ô vuông màu hồng đúng ko Hoàng ? còn ảnh JPEG là kiểu nén của ảnh BITMAP. Format của ảnh thì mình nắm còn cái mã hóa pixel thì chia nhỏ bức ảnh thành nhiều vùng nhỏ (thông thường là những vùng 8x8 pixel) rồi sử dụng biến đổi cosin rời rạc để biến đổi những vùng thể hiện này thành dạng ma trận có 64 hệ số thể hiện “thực trạng” các pixel . Thực sự mình cũng đang thắc mắc nó là ảnh màu hay ảnh đen trắng ???

2 Likes

anh không biết mục đích em chuyển ảnh ra làm gì ?
anh tìm trên google với từ khóa “c++ convert image to byte array”
thấy có link này
http://www.codeproject.com/Questions/390842/Convert-jpeg-image-to-Byte-array
hi vọng giúp được em.
anh nghĩ là microsoft có những thư viện để hỗ trợ vụ này.

Dạ e cám ơn anh nhưng mà cái link a đưa e đó chỉ là byte array ,jpeg thực chất nó cũng là 1 byte array nhưng ở đây em muốn truy cập vào từng pixel của ảnh .Đây là 1 phần công việc trong cái research thesis của em.Như a thấy trên hình có những sóng tín hiệu ,thì tại những pixel có sóng đi qua thì nó sẽ là 1 ,những điểm ko có sóng đi qua sẽ là 0.Anh có thể giúp em được ko ạ ?
Kiểu như hình em vẽ .

anh không biết lĩnh vực này. :frowning: nên không giúp nhiều cho em.
mới search trên mạng thấy có một số thư viện phục vụ cho việc đọc image. Như OpenCV, DevIL, Magick++ …

từ khóa “c++ read image pixels”


cái này hình như đúng với ý của em

Nếu hình của bạn thuộc Color image thì ít nhất phải có 3 channel là RGB hoặc YCbCr thì convert ra chắc chắn sẽ là byte array với 1 byte sẽ biểu diễn 1 màu => 1 pixel thì cần 24-bit.

Bạn muốn ra được 0, 1 thì phải dùng hình gray color image cơ, tức là hình trắng đen ấy, hình này chỉ có 1 channel và 1 biểu diễn màu đen, 0 màu trắng theo đúng ý bạn => 1 pixel là 8 bit

Dù ở dạng màu hay trắng đen bạn đều truy cập được từng pixel duoc het, dùng pointer.
Dùng API của OpenCV thì OpenCV nó giấu matrix trong kiểu dữ liệu CvArray hay là IplImage rồi, bạn không lấy ra được thành header file đâu. Mình có dùng 1 tool trên mạng convert thành byte array nhưng mà kiếm ko ra nữa, bạn chịu khó google.

1 Like

Bài toán này đơn giản, nhưng mọi người suy nghĩ xử lý ảnh hay gì gì đấy cao siêu quá. Nếu hôm nay cuối tùân mình code cho bạn nhưng gìơ không có thời kỳ gian nên bạn tựa code nhé. Đọc file ảnh sử dụng hàm api của windows, sau đó chuyển điểm ảnh lại thành 1 số long , bạn sẽ được matrix điểm ảnh. Matrix là mảng chiều, bạn xử lý nó.

1 Like

Mình mới làm quen với việc code , thực sự cảm ơn bạn TuyenDoThanh nhiệt tình giúp nhưng thật sự bạn nói như vậy mình cũng ko biết code như thế nào .Có thể cuối tuần này bạn có thể giúp mình được ko? Bạn ở tp HCM ko ,nếu được có thể dành ít time mình gặp trực tiếp được ko ? Cám ơn bạn rất nhiều .

Cám ơn bạn mrmike612 nhiều .Hình của mình chỉ có nền màu hồng này ,còn tín hiệu quan trọng chỉ là màu đen thì theo bạn hình này là màu hay trắng đen . :persevere:

Mình đọc hết cmt nhưng vẫn chưa hiểu ý cái bài của bạn là như thế nào, hay chỉ đơn giản là chuyển file ảnh jpeg sang mảng nhị phân thôi, nếu mà chỉ đơn giản như thế theo mình thì bạn có thể dùng OpenCV để sử dụng cái API xử lý ảnh của nó nếu cảm thấy có thời gian tải vì nó cũng khá nặng, ngược lại mình nghỉ chỉ cần bạn đọc file ảnh, nếu nó là ảnh màu thì nó có đến ba chanel R G B, nhưng ở đây là bạn chỉ quan tâm đến 1 (đen) và 0 (trắng), ảnh màu -> ảnh xám [0,255] -> ảnh nhị phân rồi đưa nó ra mảng nhị phân thôi (màu của ảnh nhị phần [0,1]), code XL ảnh = C++ lâu quá rồi mình ko nhớ nhiều :smile:, ko biết ý kiến của mình có đúng ý của chủ thớt ko :blush:

2 Likes

Đúng ý mình rồi ,như bạn nhìn hình ở trên có những sóng tín hiệu , công việc của mình là chuyển ảnh jpeg này để hiển thị các tín hiệu đó tại mỗi điểm ảnh , 1 là có tín hiệu đi qua và tại 0 là nơi ko có tín hiệu đi qua .Nhưng mình còn 1 thắc mắc nữa là cái ảnh ở trên nó có những ô màu hồng như vậy thì nó là ảnh màu hay ảnh đen trắng ??? :sob:

Có cái màu hồng đương nhiên nó là ảnh màu rồi bạn, mình đề xuất hai cách như thế này nhé

  • Mình xử lý trên ảnh màu.
  • Mình xử lý trên ảnh xám (được chuyển từ anh màu sang nhé).
  • Mình xử lý trên ảnh đen trắng (có 2 màu thôi)

*** XL ảnh màu:

  • Đương nhiên là mình sẽ đọc qua các điểm ảnh (pixel) của điểm ảnh (đây là ảnh màu) thì ta sẽ có 3 chanel là R G B (nếu nó là (0,0,0) thì nó là màu đen đấy) nhưng ở đây các điểm ảnh đên của sóng chưa chắc đã đúng là màu đen nhất, kiểu như nó xêm xêm đen ấy, tiệm cận ( 0,0,0) ấy, nên ta sẽ cho nó một khoảng giá trị (vd là (5,5,5,)) nếu nó nhỏ hơn thì mình cho nó là 1 (đen) ngược lại là 0 (trắng).
    *** XL ảnh xám:

    Mình chuyển cái ảnh của bạn thành ảnh xám, duyệt hết pixel, nếu > 128 thì nó là trắng ngc lại là đen, bạn có thể tháy đổi cái giá trị 128 rồi test nhìu lần để có kq chính xác nhất.
    *** XL ảnh nhị phân
    Không còn gì để bàn cãi nữa, nó ra nguyển ma trận pixel chỉ có 255 và 0 , 0 là đen và 255 là trắng, quá đơn giản rồi nhỉ :slight_smile:

Dĩnh ơi mình chuyển thẳng từ ảnh của mình qua đen trắng bằng code dưới đây,nhưng chất lượng ảnh mình thấy hơi xấu .Nếu như vậy thì mình có thể xử lý như cách Dĩnh chỉ mình ko .(Bỏ qua công đoạn chuyển qua grayscale )

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "Bien_Doi_Anh_Xam.h"
using namespace std;
using namespace cv;
int main()
{
	{
		string s1="";
		Mat src1;
		s1 = "thumuc/hr45.jpg";
		src1 = imread(s1,CV_LOAD_IMAGE_COLOR);
		if(src1.empty()) 
		{
			cout<<"No image"<<endl;
			//continue;
		}
		imshow("Anh goc",src1);
		Mat frame = src1.clone();
		Mat image;
		GaussianBlur(frame, image, Size(0, 0), 10);
		//addWeighted(frame, 3.5, image, -2.5, 7, image);	

		Mat binary;
		convert_binary(frame,binary);
		imshow("Anh sau khi bien doi",binary);
		waitKey(0);
		return 0;
	}


}

Cái hình có màu hồng mà hỏi hình này là hình màu hay hình trắng đen =.=
Đã nhìn vô thấy màu rồi thì nó là hình màu chứ hình trắng đen gì …

Cái này là bạn chuyển qua anh nhị phân rồi đó, giờ bạn chỉ cần đọc các pixel của nó, nếu nó = 0 -> 1 (đen), nếu nó = 255 -> 0 (trắng) như đề bài bạn yêu cầu rồi đó.
Nhưng mình nghĩ nên chuyển sang ảnh xám, vì chuyển qua nhị phân như của bạn dữ liệu không còn chính xác lắm, cách xử lý ảnh xám mình có đề cập rồi đó. :smile: , để loại mấy cái chấm chấm hồng hồng kia (đã chuyển qua xám rồi nha) mình nghĩ bạn nên test thử xét giá trị x =50 , nếu mà nhỏ hơn 50 thì mới là đen, còn > 50 (có thể là hơi đen hoặc trắng) mình cho nó là trắng luôn. :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?