Sơ đồ thực hiện bài toán ứng dụng

Một phần của tài liệu một số kĩ thuật nén ảnh và ứng dụng (Trang 51 - 67)

Bước 1: Chọn ảnh từ thư mục file ảnh vào là file *.bmp sẽ cho ta được một ảnh gốc *.bmp và 3 ảnh trên ba kênh Red, Green, Blue.

Bước 2: Ta chọn một trong ảnh trên để nén.

Bước 3: Chương trình hiện ra của sổ để lưu ảnh đã được nén. Sau khi ghi tên file ảnh mới. Chương trình sẽ đưa ra của sổ thông báo “đã hoàn tất chương trình”.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Bước 4: Ảnh sau khi nén được dùng để gửi qua mạng cho bạn bè, người thân trên mọi miền đất nước.

Hình 3.2. Sơ đồ thực hiện bài toán ứng dụng 3.3.2. Các tham số thử nghiệm

. Các tham số được xác định là :

Không gian màu

Y = 0,2989 R + 0,5866 G + 0,1145 B Cb = -0,1687 R - 0,3312 G + 0.5000 B Cr = 0.5000 R - 0,4183 G - 0,0816 B

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ khac u v khi v u khi v u khi v u C v u v y u x y x f v u C v u F x y , 1 0 , 0 : , 2 1 0 , 0 : , 2 1 0 : , 2 1 ) , ( 7 ,... 1 , 0 , ; . . 16 1 2 cos( ). . . 16 1 2 cos( ). , ( 4 ) , ( ) , ( 7 0 7 0 . 3.3.3. Một số kết quả thử nghiệm.

Hình 3.3. Giao diện chƣơng trình ứng dụng

Bước 1: Mở giao diện chương trình

Bước 2: Kích vào chọn ảnh, sau đó chọn chất lượng ảnh. Trong chương trình ta có thể nén ảnh gốc và ta cũng có thể nén ảnh trên ba kênh màu Red, Blue hoặc Green.

Bước 3: Nếu ta chọn „nén ảnh gốc‟, chọn chất lượng ảnh ở đây ta chọn là 100. Bước 4: Chọn nén ảnh gốc, chương trình hiện của sổ để ghi tên file sau khi nén sau khi nén xong chương trình sẽ hiện một của sổ thông báo quy trình nén đã hoàn tất. Ta ấn OK và vào của sổ thư mục để lấy ảnh đã nén.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Hình 3.4. Giao diện chƣơng trình chạy thử

Hình 3.5. Cửa sổ thông báo hoàn tất quy trình nén ảnh

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Hình 3.6. Kết quả sau khi thử nghiệm với ảnh *.gif

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Sau khi nén ảnh gốc „ảnh nghệ thuật.gif‟ kích thước 1024x682 và size 202 KB ta được ảnh nén ‟44.jpeg‟ kích thước 1024x682 và size 162 KB, ảnh nén trên kênh Red kích thước là 1024x682 và size 69,1 KB, ảnh nén trên kênh Green kích thước là 1024x682 và size 132 KB, ảnh nén trên kênh Blue kích thước là1024x682 và size 66,1 KB.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

Hình 3.7. Thử nghiệm với ảnh JPEG.

File ảnh vào DSC04371.jpeg với kích thước 480x640 và size là 160 KB, ta được ảnh nén „huy1.jpeg‟ kích thước 480x640 và size 29 KB, ảnh nén trên kênh Red kích thước là 480x640 và size 19,1 KB, ảnh nén trên kênh Green kích thước là 480x640 và

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

size 25,6 KB, ảnh nén trên kênh Blue kích thước là 480x640 và size 18,3 KB.

3.3.4. Đánh giá chƣơng trình thử nghiệm

Sau khi

:

1. Ưu điểm: Chương trình cài đặt JPEG khi nén các file ảnh dạng *.gif, *.png, *.bmp (ảnh 16 màu, 256 màu, 24 bit màu) thì cho kết quả nén khá tốt, tỉ lệ nén cao, chất lượng tốt.

2. Nhược điểm: Đối với ảnh đa mức xám thì chương trình nén có thể cho kích cỡ lớn hơn nhiều so với ảnh gốc, cũng có thể cho kích thước ảnh nén nhỏ hơn so với kích thước ảnh gốc nhưng không đáng kể. Đối với ảnh có đôi *.jpeg thì kết quả nén giảm khoảng 30% đến 40% so với kích thước ảnh ban đầu và hiệu quả nén tỷ lệ nghịch với nhau, chất lượng ảnh nén tốt thì kích thước file giảm ít và ngược lại. Ảnh sau khi nén không được phục hồi lại trạng thái ban đầu, vì luận văn mới chie xây dựng chương trình nén ảnh, chưa xây dựng chương trình gải nén.

3.4. Kết luận chƣơng

. Chương về thử nghiệm nguồn, cho phép thực hiện nhiệm vụ nén ảnh JPEG.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

KẾT LUẬN

Trong thời gian làm đề tài với sự hạn chế về thời gian, tài liệu, cơ sở vật chất cũng như hạn chế về kiến thức đòi hỏi bản thân tôi phải cố gắng tìm tòi và nhiệt tình trong công việc nghiên cứu đề tài và cuối cùng đề tài đã hoàn thành trọn vẹn. Đó là kết quả của một thời gian dài nỗ lực nghiên cứu của tôi dưới sự hướng dẫn tận tình, chu đáo của giáo viên hướng dẫn nên đề tài đã hoàn thành đúng thời hạn.

, luận :

1. Tìm hiểu được tổng quan về xử lý ảnh và nén ảnh là một trong các nhiệm vụ của xử lý ảnh.

2. Hiểu thêm về một số thuật toán mã hóa và nén dữ liệu bảo toàn đã trình bày các khái niệm, định lý cơ bản cần thiết của kỹ thuật mã hóa, nén dữ liệu ảnh và các nguyên tắc, cơ sở lý thuyết, so sánh các thuật toán của một số phương pháp nén ảnh phổ biến như: mã loạt dài RLE, LZW.

3. Một số kĩ thuật nén không bảo toàn như nén ảnh JPEG, H.264, AIC và so sánh các chuẩn nén ảnh này. Luận văn đã trình bày thuật toán nén ảnh AIC đây là thuật toán nén ảnh kết hợp các khối dự đoán từ kĩ H.264 và DCT trong thuật toán nén ảnh JPEG, thuật toán nén ảnh nâng cao AIC đang được quan tâm phát triển vì các tính năng nổi bật so với các phương pháp khác.

4. Từ những thuật toán trên luận văn còn tìm hiểu và chạy thử nghiệm, cài đặt ứng dụng để minh họa các vấn đề trình bày trong đề tài. So sánh các kết quả đã đạt được với các phần mềm hiện có. Em lựa chọn chuẩn nén JPEG để giải quyết bài toán ứng dụng. JPEG cho hiệu suất nén cao đối với các loại ảnh *.bmp; *.jpeg; *.gif; *.png chất lượng ảnh bảo đảm.

2. Một số hạn chế

1. Các thuật toán nén dữ liệu như RLE, LZW và chuẩn nén JPEG được trình bày trong luận văn đã ra đời từ nhiều năm trước do đó cần nghiên cứu những

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

cải tiến, kết hợp các thuật toán trên sao cho kết quả nén ảnh được tốt nhất và tốc độ nén được nâng cao. Chương trình nén ảnh JPEG chưa xây dựng được chương trình giải nén, ảnh sau khi nén truyền qua mạng đã không thể khôi phục lại trạng thái ban đầu.

2. Thuật toán AIC trong luận văn còn mới và đang trong giai đoạn tìm hiểu và phát triển, việc thuật toán AIC kết hợp giữa thuật toán H.264 (chuẩn nén video) và thuật toán nén ảnh JPEG đã đem lại những phương pháp nén ảnh mới, tốc độ nén nhanh, chất lượng ảnh và dung lượng file nén tốt

1. Tiếp tục xây dựng chương trình giải nén JPEG như đã đề cập ở trên của luận văn.

2. Mã hóa hình ảnh nâng cao AIC vẫn còn trong giai đoạn thử nghiệm và phát triển trong tương lai, để trở thành một sản phẩm hoàn thiện cần cải tiến AIC thực hiện tốt hơn, giảm chi phí cho AIC nhiều hơn. Tìm hiểu thêm về các thuật toán nén ảnh mới hiện nay như: JPEG-XR, JPEG-LS,... để so sánh với AIC.

3. Tiếp tục tìm hiểu các thuật toán nén ảnh độ nét cao, có tốc độ nén nhanh và kết quả tốt hơn mà chất lượng ảnh vẫn có thể được giữ nguyên. Đặc biệt là đi sâu vào tìm hiểu các chuẩn nén âm thanh, chuẩn nén hình ảnh với độ nét cao.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

TÀI LIỆU THAM KHẢO Tiếng Việt

[1]. Đỗ Hoàng Tiến và Vũ Đức Lý. Truyền hình số. NXB Khoa học và kỹ thuật – Hà Nội, 2000

[2]. Đỗ Năng Toàn, Phạm Việt Bình. Giáo trình xử lý ảnh, Đại học Thái Nguyên, 2007

[3]. Hồ văn Sung. Xử lý ảnh số lý thuyết và thực hành, NXB Khoa học và kỹ thuật – Hà Nội, 2009

[4]. Nguyễn Đăng Bình. Giáo trình xử lý ảnh số, Trường Đại Học Khoa Học Huế, 2011

[5]. – ,

2002

Tiếng Anh

[6]. David Salomon - “Data Compression - The Complete Reference” (2001)

[7]. Jin Li - “Image Compression - the Mechanics of the JPEG2000”(2001)

[8]. Satish Kumar - “An Introduction to Image Compression” (10/2001)

[9]. Iain E.G. Richardson (2010), H.264 and MPEG-4 video compression: Video coding for Next-generation MultiMedia. Explains the details of the H.264 and MPEG-4 standards

[10]. R.C.Gonzalez, R.E.Woods, Steven L.Eddins, Digital Image Processing Using Matlab, Prentice Hall, 2003.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ PHỤ LỤC Chương trình nén ảnh JPEG using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using JpegEncoder; namespace EncoderUI {

public partial class frmJPGEncoder : Form

{ public frmJPGEncoder() { InitializeComponent(); } byte[, ,] image_array; Bitmap mainLoadedImage; String InputFileName = ""; String OutputFileName = ""; Int64 outputFileLength = 0;

Point originalDimension = new Point(0, 0); Point actualDimension = new Point(0, 0);

Utils.ProgressUpdater progressObj = new Utils.ProgressUpdater(); Utils.CurrentOperationUpdater currentOperationObj = new

Utils.CurrentOperationUpdater();

private void Write_Channel_Images(bool WriteYCbCrChannel, Bitmap

bmpImage, bool DrawInBW, Utils.IProgress progress, Utils.ICurrentOperation

operation) {

byte[, ,] y_channel = Imaging.Get_Channel_Data(image_array, DrawInBW, bmpImage.Width, bmpImage.Height, WriteYCbCrChannel ?

Imaging.ChannelType.Y : Imaging.ChannelType.R);//, progress, operation);

YChPictureBox.Image = Utils.Write_Bmp_From_Data(y_channel, new

Point(bmpImage.Width, bmpImage.Height), progress, operation);

byte[, ,] cb_channel = Imaging.Get_Channel_Data(image_array, DrawInBW, bmpImage.Width, bmpImage.Height, WriteYCbCrChannel ?

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

CbChPictureBox.Image = Utils.Write_Bmp_From_Data(cb_channel, new

Point(bmpImage.Width, bmpImage.Height), progress, operation);

byte[, ,] cr_channel = Imaging.Get_Channel_Data(image_array, DrawInBW, bmpImage.Width, bmpImage.Height, WriteYCbCrChannel ?

Imaging.ChannelType.Cr : Imaging.ChannelType.B); ;//, progress, operation);

CrChPictureBox.Image = Utils.Write_Bmp_From_Data(cr_channel, new

Point(bmpImage.Width, bmpImage.Height), progress, operation);

}

private void open_Click(object sender, EventArgs e) {

OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Image

Files|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tiff|BMP Files|*.bmp|JPEG

Files|*.jpeg;*.jpg|PNG Files|*.png|GIF Files|*.GIF|All Files|*.*";

if (DialogResult.OK == ofd.ShowDialog()) { mainPictureBox.Image = null; YChPictureBox.Image = null; CbChPictureBox.Image = null; CrChPictureBox.Image = null; InputFileName = ofd.FileName;

Bitmap bmp = new Bitmap(InputFileName); mainLoadedImage = bmp;

mainPictureBox.Image = bmp;

originalDimension = new Point(bmp.Width, bmp.Height); actualDimension =

Utils.GetActualDimension(originalDimension);

Bitmap bmp1 = new Bitmap(InputFileName); image_array = Utils.Fill_Image_Buffer(bmp1);

Write_Channel_Images(false, mainLoadedImage, false, progressObj, currentOperationObj);

} }

private void Form1_Load(object sender, EventArgs e) {

quantizerQualityComboBox.SelectedIndex = 5;

Tables.Precalculate_YCbCr_Tables(); // For getting tables to convert RGB to YCbCr

}

private void WriteJpgButton_Click(object sender, EventArgs e) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

SaveFileDialog sfd = new SaveFileDialog(); sfd.RestoreDirectory = true;

sfd.Filter = "Jpeg (*.jpg)|*.jpg|All files (*.*)|*.*"; if (DialogResult.OK == sfd.ShowDialog())

{

OutputFileName = sfd.FileName;

FileStream fs = new FileStream(OutputFileName,

FileMode.Create, FileAccess.Write, FileShare.None);

BinaryWriter bw = new BinaryWriter(fs);

JpegEncoder.BaseJPEGEncoder encoder = new BaseJPEGEncoder(); encoder.EncodeImageBufferToJpg(image_array, originalDimension, actualDimension, bw, float.Parse(quantizerQualityComboBox.Text)); fs.Flush(); outputFileLength = fs.Length; fs.Close();

MessageBox.Show("Quá trình chuyển đổi định dạng ảnh đã

xong", "Nén dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Information);

} }

private void YChPictureBox_Click(object sender, EventArgs e) { if (mainPictureBox.Image != null) { if (YChPictureBox.Image != null) mainPictureBox.Image = YChPictureBox.Image; } }

private void mainPictureBox_Click(object sender, EventArgs e) {

if (mainLoadedImage != null)

mainPictureBox.Image = mainLoadedImage; }

private void CbChPictureBox_Click(object sender, EventArgs e) { if (mainPictureBox.Image != null) { if (CbChPictureBox.Image != null) mainPictureBox.Image = CbChPictureBox.Image; } }

private void CrChPictureBox_Click(object sender, EventArgs e) {

if (mainPictureBox.Image != null) {

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

if (CrChPictureBox.Image != null)

mainPictureBox.Image = CrChPictureBox.Image; }

}

private void YCbCrDisplayTypeRadioButton_CheckedChanged(object

sender, EventArgs e) {

LoadChannelImages(); }

private void DrawInBWCheckBox_CheckedChanged(object sender,

EventArgs e) { if (RGBDisplayTypeRadioButton.Checked == true) { LoadChannelImages(); } }

private void LoadChannelImages() {

// if (YCbCrDisplayTypeRadioButton.Checked)

// {

// Y_Label.Text = "Y Channel";

// Cb_Label.Text = "Cb Channel";

// Cr_Label.Text = "Cr Channel";

// }

//else

{

Y_Label.Text = "Red Channel"; Cb_Label.Text = "Green Channel"; Cr_Label.Text = "Blue Channel"; }

}

private void writeCurrentImageButton_Click(object sender, EventArgs

e)

{

SaveFileDialog sfd = new SaveFileDialog(); sfd.RestoreDirectory = true;

sfd.Filter = "Jpeg (*.jpg)|*.jpg|All files (*.*)|*.*"; if (DialogResult.OK == sfd.ShowDialog())

{

OutputFileName = sfd.FileName;

FileStream fs = new FileStream(OutputFileName,

FileMode.Create, FileAccess.Write, FileShare.None);

BinaryWriter bw = new BinaryWriter(fs);

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/ encoder.EncodeImageToJpg(mainPictureBox.Image, bw, float.Parse(quantizerQualityComboBox.Text));//, fs.Flush(); outputFileLength = fs.Length; fs.Close();

MessageBox.Show("Quá trình chuyển đổi định dạng ảnh đã

xong", "Nén dữ liệu", MessageBoxButtons.OK, MessageBoxIcon.Information);

} }

private void btnChonAnh_Click(object sender, EventArgs e) {

OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Image

Files|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tiff|BMP Files|*.bmp|JPEG

Files|*.jpeg;*.jpg|PNG Files|*.png|GIF Files|*.GIF|All Files|*.*";

if (DialogResult.OK == ofd.ShowDialog()) { mainPictureBox.Image = null; YChPictureBox.Image = null; CbChPictureBox.Image = null; CrChPictureBox.Image = null; InputFileName = ofd.FileName;

Bitmap bmp = new Bitmap(InputFileName); mainLoadedImage = bmp;

mainPictureBox.Image = bmp;

originalDimension = new Point(bmp.Width, bmp.Height); actualDimension =

Utils.GetActualDimension(originalDimension);

Bitmap bmp1 = new Bitmap(InputFileName); image_array = Utils.Fill_Image_Buffer(bmp1);

Write_Channel_Images(false, mainLoadedImage, false, progressObj, currentOperationObj);

} }

private void mainPictureBox_DoubleClick(object sender, EventArgs e) {

btnChonAnh_Click(sender, e); }

private void button1_Click(object sender, EventArgs e) {

DisplayGroupBox.Enabled = true; }

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

} }

Một phần của tài liệu một số kĩ thuật nén ảnh và ứng dụng (Trang 51 - 67)