Ứng dụng chỉnh sửa ảnh dạng Bitmap + tăng giảm độ sáng+tăng giảm độ tương phản+chuyển ảnh về dạng đen trắng+phân ngưỡng ảnh+phóng to thu nhỏ ảnhMỤC LỤCCHƯƠNG 1. PHÂN TÍCH ĐỀ TÀI……………………………………………31.1 Lý do chọn đề tài………………………………………………………….31.2Mục tiêu hướng đến …………………..…………………………………..3CHƯƠNG 2. GIỚI THIỆU CHUNG VỀ XỬ LÝ ẢNH……………………....42.1Những khái niệm cơ bản về ảnh …………………………………............42.2.1Điểm ảnh (pixel element) ……………..…………………………….42.2.2Độ phân giải của ảnh (resolution) …………………………………..42.2.3Mức xám ………………..…………………………………………...42.2.4Các loại ảnh số cơ bản….. …………………………………………..42.2Tìm hiểu định dạng ảnh BITMAP …………………….............................52.3.1Phần header ………………………………………………………….52.3.2Phần information ……………………………………………………52.3.3Phần color palette……………………………………………………62.3.4Phần data …………………………………………………………….6CHƯƠNG 3. MỘT SỐ BÀI TOÁN VỀ XỬ LÝ ẢNH ………….……………..73.1Phóng to thu nhỏ ảnh ……………………………………………………..73.1.1Phóng to ảnh…………………………………………………………73.1.2Thu nhỏ ảnh………………………………………………………….73.2Tăng, giảm độ sáng của ảnh ………………………………………………73.3Tăng giảm độ tương phản của ảnh ……………………………………….83.4Chuyển ảnh về dạng đen trắng ....................................................................83.5Phân ngưỡng ảnh…………………………………………………………..8CHƯƠNG 4. CHƯƠNG TRÌNH VÀ KẾT QUẢ ………………………………104.1.Khai báo các biến cấu trúc ……………………………………………….104.2.Khai báo các hàm vào ra dữ liệu ………………………………...………
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI - - BÀI TẬP KỸ THUẬT LẬP TRÌNH (EE 3490) Tên đề tài: XÂY DỰNG CHƯƠNG TRÌNH XỬ LÝ ẢNH VỚI CÁC CHỨC NĂNG CƠ BẢN Hà nội,2016 MỤC LỤC CHƯƠNG PHÂN TÍCH ĐỀ TÀI……………………………………………3 1.1 Lý chọn đề tài………………………………………………………….3 1.2 Mục tiêu hướng đến ………………… ………………………………… CHƯƠNG GIỚI THIỆU CHUNG VỀ XỬ LÝ ẢNH…………………… 2.1 Những khái niệm ảnh ………………………………… 2.2.1 Điểm ảnh (pixel element) …………… …………………………….4 2.2.2 Độ phân giải ảnh (resolution) ………………………………… 2.2.3 Mức xám ……………… ………………………………………… 2.2.4 Các loại ảnh số bản… ………………………………………… 2.2 Tìm hiểu định dạng ảnh BITMAP …………………… 2.3.1 Phần header ………………………………………………………….5 2.3.2 Phần information ……………………………………………………5 2.3.3 Phần color palette……………………………………………………6 2.3.4 Phần data …………………………………………………………….6 CHƯƠNG MỘT SỐ BÀI TOÁN VỀ XỬ LÝ ẢNH ………….…………… 3.1 Phóng to thu nhỏ ảnh …………………………………………………… 3.1.1 Phóng to ảnh…………………………………………………………7 3.1.2 Thu nhỏ ảnh………………………………………………………….7 3.2 Tăng, giảm độ sáng ảnh ………………………………………………7 3.3 Tăng giảm độ tương phản ảnh ……………………………………….8 3.4 Chuyển ảnh dạng đen trắng 3.5 Phân ngưỡng ảnh………………………………………………………… CHƯƠNG CHƯƠNG TRÌNH VÀ KẾT QUẢ ………………………………10 4.1 Khai báo biến cấu trúc ……………………………………………….10 4.2 Khai báo hàm vào liệu ……………………………… ………10 4.3 Các hàm xử lý ảnh ……… ………………………………………………12 4.4 Chương trình …………………………………………………… 17 4.5 Kết …………………………………………………………………….19 CHƯƠNG ĐÁNH GIÁ NHẬN XÉT …………………………………………24 Danh mục tài liệu tham khảo .………………………………………………….25 CHƯƠNG PHÂN TÍCH ĐỀ TÀI 1.1 Lý chọn đề tài Ảnh vật dụng xuất lâu với người.Từ xuất trở thành vật dụng thiết yếu sống.Các ảnh đảm bảo lưu trữ thông tin vô tiện lợi đảm bảo độ xác cao Với phát triển ngày nhanh khoa học công nghệ, nhu cầu lưu trữ trích xuất thông tin ảnh ngày cao dẫn đến nhu cầu tất yếu cho ứng dụng xử lý ảnh Xử lý ảnh lĩnh vực mang tính chất khoa học công nghệ,nó ngành khoa học mẻ so với ngành khác tốc độ phát triển nhanh, tạo điều kiện thuận lợi để phát triển ứng dụng ngày mạnh mẽ để phục vụ Các phương pháp xử lý ảnh bắt nguồn từ ứng dụng nâng cao chất lượng ảnh phân tích ảnh Trong thời đại xử lý ảnh lại trở nên cấp thiết không nhận ảnh chụp gần,rõ nét mà có nhiều ảnh chụp không gian vũ trụ, hành tinh hay ảnh nhận thông qua cảm biến, qua đường truyền không dây Mỗi loại ảnh lại có tính chất chất lượng riêng biệt đòi hỏi ứng dụng xử lý ảnh phải có tính mẻ mạnh mẽ 1.2 Mục tiêu đề Xử lý ảnh có nhiều vấn đề phương pháp, đề tài em trình bày số vấn đề sau: - Phóng to thu nhỏ ảnh - Tăng giảm độ sáng ảnh - Tăng giảm độ tương phản ảnh - Chuyển ảnh dạng đen trắng (grayscale) - Phân ngưỡng (threshold) CHƯƠNG GIỚI THIỆU CHUNG VỀ XỦ LÝ ẢNH 2.1 Các khái niệm ảnh 2.1.1 Điểm ảnh (pixel element) Gốc ảnh (ảnh tự nhiên) dạng ảnh liên tục không gian độ sáng Để xử lý máy tính, ảnh cần phải số hóa Quá trình số hóa ảnh biến đổi gần ảnh liên tục thành tập điểm phù hợp với ảnh gốc vị trí độ sáng Kích cỡ khoảng cách điểm ảnh giữ mức cho mắt người không nhìn thấy ranh giới chúng Mỗi điểm ảnh gọi pixel Trong ảnh chiều điểm ảnh biểu diễn trục x,y, điểm ảnh có cặp giá trị tọa độ (x,y) 2.1.2 Độ phân giải ảnh (resolution) Là mật độ điểm ảnh ảnh số, tính số pixel đơn vị độ dài chiều Độ phân giải lớn ảnh mịn 2.1.3 Mức xám (gray) Là kết biến đổi tương ứng giá trị độ sáng điểm ảnh với giá trị nguyên dương Thông thường xác định giá trị khoảng [0…255] Tùy thuộc vào giá trị xám mà ta xác định số bit dùng để biểu diễn pixel 2.1.4 Các loại ảnh số a ảnh nhị phân Ảnh nhị phân ảnh mà pixel biểu diễn bit Vì pixel có hai giá trị (đen) 1(trắng) nên ảnh có màu đen trắng b Ảnh xám Ảnh xám ảnh mà pixel biểu diễn byte có giá trị từ đến 255 Vì ảnh thể màu xám với mức sáng khác c Ảnh màu 24bit Theo thuyết cảu Thomas ảnh màu ảnh tổ hợp từ màu R(red), G(green) B(blue) Với tổ hợp giá trị xám màu thành phần ta màu Do màu thành phần biểu diễn byte nên pixel ảnh loại chiếm 24bit 2.2 Tìm hiểu định dạng ảnh BITMAP Hiện có nhiều định dạng ảnh khác JPEG, JPG , PNG, BMP… Trong Bitmap, thuộc loại ảnh màu 24 bit, loại ảnh dễ xử lý có tốc độ xử lý nhanh không bị nén phương thức Vì mà có nhược điểm kích cỡ lớn không thích hợp cho lưu trữ truyền tải Cầ trúc tệp tin bitmap gồm phần sau: 2.2.1 Phần header Cấu trúc header gồm phần sau: bfType: Kí hiệu định dạng file bitmap, kí tự "BM" chiếm byte bfSize : Kích thước file chiếm byte bfReserved1: Phần dự trữ file chiếm byte bfReserved2: Phần dự trữ file chiếm byte bfOffBits : Vị trí bắt đầu nội dung file chiếm byte Tổng cộng phần header chiếm 14 byte 2.2.2 Phần information Cấu trúc information gồm có: Struct_size: Kích cỡ struct (40byte) chiếm byte Width: Chiều ngang ảnh chiếm byte Height: Chiều cao ảnh chiếm byte Planes: số lượng planes đặt chiếm byte Bitpercolor: Số lượng bit pixel (bằng 24 với file bmp) chiếm byte M_compression_type: Loại nén ảnh chiếm byte size_image: kích cỡ ảnh chiếm byte xpremeter: độ phân giải chiều ngang chiếm byte ypremeter: độ phân giải chiều dọc chiếm byte m_color_used: số lượng màu sử dụng chiếm byte m_color_important: số lượng màu “important” chiếm byte Tổng cộng phần information chiếm 40 byte 2.2.3 Phần color palette Color Palette định nghĩa màu sử dụng ảnh: Gồm nhiều có kích thước bytes xếp liền theo cấu trúc: Blue – Green – Red – Reserved Kích thước bảng màu (4*x bytes) , x số màu sử dụng ảnh Note : Bảng màu hình có thứ tự : Red – Green – Blue Bảng màu bitmap có thứ tự : Blue – Green – Red Nên đọc bảng màu ảnh bitmap cần phải chuyển đổi cho thứ tự Ở phần ta thao tác với ảnh bitmap không nén nên không cần sử dụng phần 2.2.4 Phần Data Phần data để lưu trữ liệu ảnh, chứa giá trị màu điểm ảnh - Các điểm ảnh lưu từ trái qua phải dòng sau lưu từ lên - Mỗi pixel chứa byte byte lưu mức xám ảnh theo thứ tự B,R,G Lưu ý về: Padding bytes: Thực tế mảng pixel nạp vào nhớ, hàng phải bắt đầu địa nhớ mà địa bội số Nhưng ta có sử dụng byte cho pixel nên dòng kết thúc với địa không chia hết cho Vì dòng có padding bytes để hạn chế/bù đắp số byte thiếu đảm bảo kết thúc dòng địa nhớ bội số Ví dụ ảnh có kích thước 10x14 (14 width) padding 14 x = 42 (nhân số byte pixel) 42 % = Còn ảnh có kích thước 3x4 (4 width) padding 4x3 = 12 12 % = CHƯƠNG CÁC BÀI TOÁN VỀ XỬ LÝ ẢNH Các toán xử lý ảnh thao tác dựa việc thay đổi tính chất file bitmap Các thay đổi thực thay đổi tính chất pixel, thay đổi độ lớn ảnh… 3.1 Phóng to, thu nhỏ ảnh 3.1.1 Phóng to ảnh zoom in Mỗi ảnh bit map thể thông qua tập hợp pixel ảnh Mỗi pixel ảnh chiếm điểm ảnh hình Để phóng to ảnh ta tăng chiều lên n lần Vì pixel thay chiếm điểm ảnh chiếm ma trận vuông có kích thước nxn 02 03 00 01 02 02 00 00 02 02 00 00 03 03 01 01 03 03 01 01 3.1.2 Thu nhỏ ảnh zoom out Ta thu nhỏ ảnh cách tạo ảnh với màu đen trắng sau đặt ảnh vào ảnh bị thu nhỏ lại đẻ vừa với kích thước cảu ảnh tạo 02 03 00 01 3.2 Tăng giảm độ sáng ảnh Mỗi điểm ảnh đặc trưng mức xám định hay gọi độ sáng điểm ảnh Ta tăng giảm độ sáng ảnh cách cộng hay trừ tất giá trị độ sáng điểm ảnh với mức c Sau gán giá trị mức xám lại điểm ảnh tương ứng đồng thời hiệu chỉnh giá trị khoảng [0 255] 3.3 Tăng giảm độ tương phản ảnh Khi nhìn vào ảnh cảm nhận độ sáng điểm ảnh Nhưng thực tế điểm ảnh có độ sáng đặt hai khác cho cảm giác độ sáng khác Việc tăng, giảm độ tương phản tăng hay giảm độ chênh lệnh độ sáng so với Ở ta lấy điểm ảnh có độ sáng 255/2 làm ngưỡng Các điểm ảnh có độ sáng nhỏ 255/2 coi Độ phân giải c tính tương đối theo công thức x = ((100 + c) /100) với c nhỏ 100 lớn -100 B1: giá trị xám I1[i][j] = I[i][j] – 255/2 : điểm ảnh có giá trị âm B2: I1[i][j] = I1[i][j] * x; Sau nhân với x độn sáng giá trị giảm số âm ngược lại độ sáng điểm ảnh tăng B3: I1[i][j] = I1[i][j] +255/2; đưa giá trị điểm ảnh mức cũ B4 :hiệu chỉnh giá trị điểm ảnh gán trở lại giá trị xám 3.4 Chuyển ảnh dạng đen trắng(gray scale) Chuyển ảnh dạng đen trắng đồng nghĩa với việc đưa ảnh từ ảnh màu ảnh xám pixel biểu diễn mức xám Vì ta chuyển mức xám màu thành phần mức xám B1 : tính trung bình mức xám màu thành phần B2 : gán giá trị mức xám màu thành phần Lưu ý : công thức tính giá trị mức xám tương đối Tùy vào người có cảm nhận khác Đối với người vùng lạnh nhìn màu sáng quen phản giảm độ sáng cho màu lại 3.5 Phân ngưỡng ảnh Phân ngưỡng ảnh ta đặt giá trị xám làm ngưỡng Những điểm ảnh có giá trị xám lớn nhận màu đen Những điểm ảnh có giá trị xám nhỏ nhận màu trắng B1: chuyển ảnh dạng đen trắng gray scale B2: so sánh với giá trị ngưỡng lớn 1, nhỏ B3 hiệu chỉnh gián giá trị trở lại CHƯƠNG 4: CHƯƠNG TRÌNH VÀ KẾT QUẢ Em thực lập trình visual studio 2015 theo hướng lập trình cấu trúc 4.1 Khai báo biến cấu trúc Cấu trúc pixel: struct pixel { unsigned char R; unsigned char G; unsigned char B; }; Do màu R G B có giá trị [0 255] nên màu có kiểu liệu unsigned char Cấu trúc phần header information ( em gộp phần làm thành cấu trúc bmpinfor) struct bmpinfor { unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned }; //khai bao vung luu information file bmp char char char char char char char char char char char char char char char type[2]; //chứa kí tự "BM" de nhan dien file file_size[4]; // lưu kich co file reserved[4]; //phan du tru data_offset[4]; //vi tri phan data tinh tu dau file struct_size[4]; // lon cua struct infor width[4]; // chieu ngang height[4]; // chieu doc planes[2]; // so luong planes (băng vơi file bmp) bitpercolor[2]; // so bit quy dinh mau m_compression_type[4]; // dang nen size_image[4]; //kich co anh xpremeter[4]; // phan giai chieu x ypremeter[4]; // phan giai chieu y m_color_used[4]; // so luong mau su dung m_color_important[4]; // so luong mau important 4.2 Các hàm vào liệu a Hàm đọc file: readbmp void readbmp(const char *file_path, bmpinfor &bmifor, unsigned char * &data) { FILE *fp; fp = fopen(file_path, "rb"); //mo file bmp if ((fp) == nullptr) { printf("Can not read this file"); // thong bao bi loi mo } //ghi thong tin fread(&bmifor, sizeof(bmpinfor), 1, fp);// doc information //truy xuat cac gia tri can dung de doc int width =*(int*) bmifor.width; //truy xuat chieu dai 10 int pading = width % 4; // tinh pading byte pixel ** pix = new pixel*[height];// cap phat mang chieu de lưu pixel for (int i = 0; i < height; i++) { pix[i] = new pixel[width]; }; unsigned char *temp = data; // tro tam de luu data for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { pix[i][j].B = *(temp++);// lay gia tri blue pix[i][j].G = *(temp++);// lay gia tri green pix[i][j].R = *(temp++);// lay gia tri red }; temp = temp + pading;// bo qua pading file }; return pix; // tra ve mang chieu pix }; Hàm trả giá trị điểm ảnh tương ứng vùng data theo quy tắc từ trái qua phải hàng từ hàng lên hàng d Hàm chuyển pixel thành data để lưu trữ: convert_data_pixel unsigned char* convert_pixel_data(bmpinfor &bmifor, pixel **&pix) { //truy xuat gia tri int bitpercolor =*(int*) bmifor.bitpercolor; //so bit /mau int width = *(int*)bmifor.width; //chieu dai int height = *(int*)bmifor.height; //chieu rong anh //tinh toan gia tri can thiet int pad = width % 4; //pading byte int size = height*(width*(bitpercolor / 8) + pad); //kich co vung data cua unsigned char *data = new unsigned char[size]; // cap phat vung nho unsigned char *temp = data; //con tro temp tro den du lieu }; //chuyen du lieu tu pixel vao data for (int i = 0; i < (height); i++) { for (int j = 0; j < (width); j++) { *(temp++) = pix[i][j].B; // ghi gia tri blue *(temp++) = pix[i][j].G; // ghi gia tri green *(temp++) = pix[i][j].R; // ghi gia tri red }; for (int k = 0; k < pad; k++) //ghi padingbyte *(temp++) = 0; }; return data; Hàm ghi giá trị pixel vào mảng data để ghi file bmp dạng nhị phân 12 4.3 Các hàm xử lý ảnh a Hàm chuyển ảnh đen trắng: grayscale void grayscale(pixel**&pix,int height,int width ) { for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { // lấy giá trị xám trung bình int val = (pix[i][j].B + pix[i][j].G + pix[i][j].R) / 3; //tat ca cac gia tri RGB ve mot sang pix[i][j].B = pix[i][j].G = pix[i][j].R = val; } }; b Hàm phóng to ảnh: zoom_in pixel ** zoom_in(bmpinfor &bmifor,pixel**&pix, int c) { //try xuat gia tri can dung int width = *(int*)bmifor.width; //chiều ngang int height = *(int*)bmifor.height; //chiều dọc //tinh toan chieu dai chieu doc sau phóng int width_after = width*c; int height_after = height*c; //cap phat mang pixel moi co kich co gap C^2 mang ban dau pixel**pixafter = new pixel*[height_after]; for (int i = 0; i < height_after; i++) { pixafter[i] = new pixel[width_after]; }; //tao nen trang for (int i = 0; i < height_after; i++) for (int j = 0; j < width_after; j++) { pixafter[i][j].B = pixafter[i][j].G = pixafter[i][j].R = 255; }; // tang kich co cua moi pixel for (int i = 0; i < height_after; i += c) for (int j = 0; j < width_after; j += c) { for (int x = i; x < i + c; x++) //moi pix xel sa zoom bang C^2 pixel ban dau for (int y = j; y < j + c; y++) { pixafter[x][y].B = pix[i/c][j/c].B; pixafter[x][y].G = pix[i/c][j/c].G; pixafter[x][y].R = pix[i/c][j/c].R; } } } return pixafter; 13 Hàm thực phóng chiều n lần với n nhập từ bàn phím c Hàm thu nhỏ ảnh: zoom_out pixel** zoom_out(bmpinfor &bmifor, pixel **&pix, int c) { //truy xuat gia tri can dung int width = *(int*)bmifor.width; int height = *(int*)bmifor.height; //kich co moi int width_after = width*c; int height_after = height*c; // cap phat mang pixel moi pixel**pixafter = new pixel*[height_after]; for (int i = 0; i < height_after; i++) { pixafter[i] = new pixel[width_after]; }; //tao nen den for (int i = 0; i < height_after; i++) for (int j = 0; j < width_after; j++) { pixafter[i][j].B = pixafter[i][j].G = pixafter[i][j].R = 0; }; //gán ảnh cũ ảnh int w_offset = (width_after - width) / 2; //do lech chieu ngang anh int h_offset = (height_after - height) / 2; //do lenh chieu doc for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { pixafter[i+h_offset][j+w_offset].B = pix[i][j].B; pixafter[i+h_offset][j+w_offset].G = pix[i][j].G; pixafter[i+h_offset][j+w_offset].R = pix[i][j].R; }; // gan lai gia tri ngang doc moi vao bminfor unsigned char *w = convert_int_uc(width_after); unsigned char *h = convert_int_uc(height_after); for (int i = 0; i < 4; i++) { bmifor.width[i] = w[i]; bmifor.height[i] = h[i]; }; return pixafter; } Ở khai báo cấu trúc bmpinfor hoàn toàn mảng kĩ để chuyển dạng số nguyên sang dạng mảng char em khai báo hàm sau: unsigned char* convert_int_uc(int x) { unsigned char *s = new unsigned char[4]; s[0] = x % 256; s[1] = (x / 256) % 256; 14 } s[2] = (x / (256 * 256)) % 256; s[3] = (x / (256 * 256 * 256)) % 256; return s; d Hàm tăng độ sáng ảnh: inc_brightness void inc_brightness(pixel**&pix,int height,int width, int c) { if ((c255)) // kiem tra gia tri C { printf(" ban da nhap sai chi nhap cac gia tri 0