Tải bản đầy đủ (.doc) (20 trang)

Đồ án Xử lý ảnh Biến đổi ảnh với phương pháp Image Distortion

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (505.59 KB, 20 trang )

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO ĐỒ ÁN MÔN HỌC
XỬ LÝ ẢNH
Đề tài: Biến đổi ảnh với phương pháp Image Distortion
Sinh viên thực hiện:
Nguyễn Hoài Sơn, D6CNTT
Nguyễn Thị Kiều Trang, D6CNTT
Nguyễn Tuấn Đạt, D6CNTT
Giáo viên hướng dẫn:
TS. NGUYỄN HỮU QUỲNH

HÀ NỘI, THÁNG 1-2015
1


TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO ĐỒ ÁN MÔN HỌC
XỬ LÝ ẢNH
Đề tài: Biến đổi ảnh với phương pháp Image Distortion
Sinh viên thực hiện:
Nguyễn Hoài Sơn, D6CNTT
Nguyễn Thị Kiều Trang, D6CNTT
Nguyễn Tuấn Đạt, D6CNTT
Giáo viên hướng dẫn:
TS. NGUYỄN HỮU QUỲNH

HÀ NỘI, THÁNG 1-2015




LỜI NÓI ĐẦU
Thông tin được dưới 3 dạng chủ yếu là: âm thanh, văn bản và hình ảnh. Do
vậy, xử lý ảnh là một trong những lĩnh vực quan trọng của ngành công nghệ thông tin.
Mặc dù, đây là một lĩnh vực khó. Tuy nhiên, ngày nay, nó đang ngày càng trở nên
quan trọng trong hệ thống các lĩnh vực phát triển công nghệ thông tin, ứng dụng vào
để giải quyết các bài toán phục vụ nhu cầu con người.
Sau thời gian học tập tại khoa Công Nghệ Thông Tin, nhóm chúng em đã lựa
chọn đề tài Biến đổi ảnh với phương pháp Image Distortion với mong muốn vận
dụng những kiến thức mình đã học, xây dựng được một trang web có tính thực tiễn,
đồng thời mỗi thành viên trong nhóm củng cố lại những kiến thức của mình qua thực
hành.
Chúng em xin chân thành cảm ơn các thầy giáo Nguyễn Hữu Quỳnh và thầy
Cù Việt Dũng, giảng viên bộ môn “Xử lý ảnh” đã tận tình giảng dạy chúng em trong
suốt thời gian học tập vừa qua để giúp chúng em hoàn thiện đề tài này.
Chúng em xin chân thành cảm ơn thầy.

Hà Nội, ngày 5 tháng 1 năm 2014
Nguyễn Hoài Sơn
Nguyễn Thị Kiều Trang
Nguyễn Tuấn Đạt


MỤC LỤC


CHƯƠNG 1: CÁC KHÁI NIỆM TỔNG QUÁT

1.1. Xử lý ảnh

Xử lý ảnh là một ngành khoa học mới mẻ so với các ngành khoa học
khác. Hiện nay, nó đang là một học đang được quan tâm và đang giảng dạy cho
sinh viên ngành công nghệ thông tin.
Nhờ có công nghệ số hóa hiện đại, ngày nay con người có thể xử lý tín hiệu
nhiều chiều thông qua nhiều hệ thống khác nhau. Từ những mạch số đơn giản
cho đến những máy tính song song cao cấp. Mục tiêu của xử lý ảnh có thể chia
làm 3 hướng như sau:
- Xử lý ảnh mới ban đầu để thu được một ảnh mới theo tiêu chí xác định
(ví dụ, ảnh ban đầu mờ, xử lý để làm ảnh rõ nét hơn).
- Phân tích ảnh để thu được các thông tin đặc trưng, giúp cho việc phân
loại ảnh, nhận biết ảnh.
- Hiểu ảnh đầu vào để có thể mô tả ảnh ở mức cao hơn, sâu hơn. Ví dụ, từ
ảnh chụp một vụ tai nạn giao thông có thể phác thảo ra hiện trường tai
nạn đó.
1.2.

Ảnh BMP

Trong đồ họa máy vi tính, BMP, còn được biết đến với tên tiếng
Anh khác là Windows bitmap, là một định dạng tập tin hình ảnh khá phổ biến.
Các tập tin đồ họa lưu dưới dạng BMP thường có đuôi
là .BMP hoặc .DIB (Device Independent Bitmap).
Các thuộc tính tiêu biểu của một tập tin ảnh BMP (cũng như file ảnh nói
chung) là:
Số bit trên mỗi điểm ảnh (bit per pixel), thường được ký hiệu bởi n. Một
ảnh BMP n-bit có
màu. Giá trị n càng lớn thì ảnh càng có nhiều màu,
và càng rõ nét hơn. Giá trị tiêu biểu của n là 1 (ảnh đen trắng), 4 (ảnh 16
màu), 8 (ảnh 256 màu), 16 (ảnh 65536 màu) và 24 (ảnh 16 triệu màu).
Ảnh BMP 24-bit có chất lượng hình ảnh trung thực nhất.

- Chiều cao của ảnh (height), cho bởi điểm ảnh (pixel).
-

1


- Chiều rộng của ảnh (width), cho bởi điểm ảnh.
Cấu trúc tập tin ảnh BMP bao gồm 4 phần
-

Bitmap Header (14 bytes): giúp nhận dạng tập tin bitmap.
Bitmap Information (40 bytes): lưu một số thông tin chi tiết giúp hiển
thị ảnh.

-

Color Palette (4*x bytes), x là số màu của ảnh: định nghĩa các màu sẽ
được sử dụng trong ảnh.

-

Bitmap Data: lưu dữ liệu ảnh.

Đặc điểm nổi bật nhất của định dạng BMP là tập tin hình ảnh thường
không được nén bằng bất kỳ thuật toán nào. Khi lưu ảnh, các điểm ảnh được ghi
trực tiếp vào tập tin - một điểm ảnh sẽ được mô tả bởi một hay nhiều byte tùy
thuộc vào giá trị n của ảnh. Do đó, một hình ảnh lưu dưới dạng BMP thường có
kích cỡ rất lớn, gấp nhiều lần so với các ảnh được nén (chẳng
hạn GIF, JPEG hay PNG).
Định dạng BMP được hỗ trợ bởi hầu hết các phần mềm đồ họa chạy

trên Windows, và cả một số ứng dụng chạy trên MS-DOS. Ngay từ Windows
3.1, Microsoft đã cho ra đời phần mềm PaintBrush, một phần mềm hỗ trợ vẽ
hình ảnh đơn giản và lưu hình ảnh được vẽ dưới dạng BMP 16 hay 256 màu.
Tuy nhiên, do kích thước tập tin ảnh BMP quá lớn, định dạng BMP không phù
hợp để trao đổi hình ảnh qua mạng Internet (do hạn chế về tốc độ truyền dữ
liệu). Do đó, các trang web thường sử dụng ảnh dạng GIF, JPEG hay PNG. Các
định dạng này hỗ trợ các thuật toán nén hình ảnh, vì vậy có thể giảm bớt kích cỡ
của ảnh.
1.3. Thư viện đồ họa GDI++ trong C#
GDI là thư viện cung cấp các hàm (funtions) và các cấu trúc dữ liệu
(structures) cần thiết để ứng dụng tạo ra những kết xuất dưới dạng đồ họa (hiển
thị lên màn hình, in ra máy in…)
Các hàm GDI cho phép vẽ đường thẳng, đường cong, các hình đa giác,
xuất kí tự. hiển thị ảnh bitmap, in ấn…
GDI không tương tác trực tiếp với thiết bị phần cứng, mà thông qua các
driver.
2


CHƯƠNG 2: BIẾN ĐỔI ẢNH
2.1.

Phương pháp biến đổi ảnh
Để xử lý ảnh đưa vào, trước tiên chúng ta cần tạo một phân vùng để xử

lý ảnh. Ở đây chúng ta sử dụng một hình chữ nhật để ảnh được hiển thị vào
trong nó, do kích thước của các ảnh là rất khác nhau nên hình chữ nhật khởi tạo
ban đầu sau khi đưa ảnh vào sẽ có kích thước đúng bằng ảnh.
2.2.


Mục đích của việc biến đổi hình ảnh

Biển đổi ảnh là một trong những vấn đề cơ bản của xử lý ảnh. Ngoài việc
tác động đến kích thước, hình dạng của ảnh ban đầu. Việc biến đổi ảnh sẽ là tiền
đề để xây dựng các ứng dụng nâng cao, hữu ích hơn, phục vụ để giải quyết
nhiều bài toán phức tạp hơn trong lĩnh vực xử lý ảnh.
Một trong những ví dụ điểu hình cho việc ứng dụng của biến đổi ảnh là
tính năng Free Transform và Distoration trong phần mềm đồ họa Photoshop của
hang Adobe.
Một số vấn đề khác của xử lý ảnh, tùy vào từng bài toán cụ thể và mục
đích của người phát triển, nếu chúng ta biết cách kết hợp chúng với nhau sẽ tạo
ra những ứng dụng giải quyết tốt được các vấn đề cần quan tâm.
• Nắn chỉnh biến dạng.
• Khử nhiễu
• Chỉnh mức xám.
• Trích chọn đặc điểm.
• Nhận dạng .
• Nén ảnh.

3


CHƯƠNG 3: PHƯƠNG PHÁP 4-POINTS IMAGE DISTORTION
3.1.

Ý tưởng thuật toán

Ý tưởng thuật toán biến đổi ảnh với phương pháp làm méo ảnh bằng 4
điểm dựa trên làm méo hình ảnh ban đầu thành một hình ảnh khác bằng cách
thay đổi vị trí của 4 điểm riêng biệt trên 4 góc của màn hình.

Đây là một ví dụ đơn giản cho các thuật toán biến đổi hình ảnh trong lĩnh
vực xử lý ảnh. Điển hình cho ứng dụng này là tính năng Biến đổi ảnh – làm méo
ảnh (Distoration) trong phần mềm đồ họa Photoshop của hãng Adobe.
Mặc dù, trong đề tài này, ứng dụng ít tính năng hơn và tốc độ xử lý còn
chậm. Tuy nhiên, nó đã mô phỏng tương tự với Distoration trong Photoshop.
 Quá trình làm méo ảnh sử dụng lý thuyết toán học là lấy một điểm
từ ảnh bitmap được người dùng chọn và tìm tọa độ tương ứng của
nó sau khi người dùng di chuyển 1 trong 4 điểm góc của màn hình.
 Cụ thể, đầu tiên sẽ xác đỉnh điểm giao nhau giữa 4 góc.
 Sau đó, chương trình sẽ dịch chuyển ảnh, mỗi điểm ảnh sẽ được
kiểm tra để tính tọa độ cho một điểm giao nhau giữa nhau giữa 4
góc.
 Sau khi thực hiện các phép tính nhân, chia cần thiết với tất cả các
điểm giao nhau mới sẽ được kết quả là hình ảnh mới sau khi biến
đổi.
3.2.

Triển khai thuật toán

3.2.1. Thuật toán xử lý ảnh bitmap
RBGA viết tắt của từ Red Green Blue Alpha. Đôi khi RBGA được miêu tả
như là một không gian màu, nhưng trong thực tế thì nó giống hết cách dùng của
hệ màu RGB (Red Green Blue), chỉ khác có them thông tin bổ sung là giá trị
nguyên là Alpha.

4


Alpha được Catmull và Smith tìm ra trong khoảng năm 1971 – 1972. Kênh
màu Alpha thường được sử dụng như một kênh điều chỉnh hiển thị độ rõ, mờ

của ảnh. Khi giá trị của alpha tối đa (100%) thì ảnh sẽ bị ẩn hoàn toàn, ngược lại
khi alpha tối thiểu (0%) thì ảnh sẽ hiển thị hoàn toàn.

Hình 3.1: Hệ màu RGBA

File ảnh định dạng .png là một ví dụ điển hình sử dụng hệ màu RBGA.
Hàm lấy giá trị RBGA cho từng điểm ảnh (pixel)
private struct PixelData
{
public byte blue;
public byte green;
public byte red;
public byte alpha;
public override string ToString()
{
return "(" + alpha.ToString() + ", " +
red.ToString() + ", " + green.ToString() + ", " + blue.ToString()
+ ")";
}
}

Hàm xử lý ảnh đầu vào
private
private
private
private

Bitmap workingBitmap = null;
int width = 0;
BitmapData bitmapData = null;

Byte* pBase = null;

5


public FastBitmap(Bitmap inputBitmap)
{
workingBitmap = inputBitmap;
}
public void LockImage()
{
//Size
Rectangle bounds = new Rectangle(Point.Empty,
workingBitmap.Size);
width = (int)(bounds.Width * sizeof(PixelData));
if (width % 4 != 0) width = 4 * (width / 4 + 1);
//Lock Image
bitmapData = workingBitmap.LockBits(bounds,
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
pBase = (Byte*)bitmapData.Scan0.ToPointer();
}
private PixelData* pixelData = null;
public Color GetPixel(int x, int y)
{
pixelData = (PixelData*)(pBase + y * width + x *
sizeof(PixelData));
return Color.FromArgb(pixelData->alpha, pixelData>red, pixelData->green, pixelData->blue);
}
public Color GetPixelNext()
{

pixelData++;
return Color.FromArgb(pixelData->alpha, pixelData>red, pixelData->green, pixelData->blue);
}
public void SetPixel(int x, int y, Color color)
{
PixelData* data = (PixelData*)(pBase + y * width +
x * sizeof(PixelData));
data->alpha = color.A;

6


}

data->green = color.G;
data->blue = color.B;
data->red = color.R;

public void UnlockImage()
{
workingBitmap.UnlockBits(bitmapData);
bitmapData = null;
pBase = null;
}

3.2.2. Xử lý biến đổi làm méo bằng 4 đỉnh
Hàm khai báo cấu trúc vector
private struct Vector
{
public PointF Origin;

public float Direction;

}

public Vector(PointF origin, float direction)
{
this.Origin = origin;
this.Direction = direction;
}

Hàm biến đổi làm méo bằng 4 đỉnh
public static Bitmap Distort(Bitmap sourceBitmap, Point topleft,
Point topright, Point bottomleft, Point bottomright, int
interpolation)
{
double sourceWidth = sourceBitmap.Width;
double sourceHeight = sourceBitmap.Height;
//Find dimensions of new image
Point[] pointarray = new Point[] { topleft, topright,
bottomright, bottomleft };
int width = int.MinValue;
int height = int.MinValue;

7


foreach (Point p in pointarray)
{
width = Math.Max(width, p.X);
height = Math.Max(height, p.Y);

}
Bitmap bitmap = new Bitmap(width, height);
//For faster image processing
BitmapProcessing.FastBitmap newBmp = new
BitmapProcessing.FastBitmap(bitmap);
BitmapProcessing.FastBitmap sourceBmp = new
BitmapProcessing.FastBitmap(sourceBitmap);
newBmp.LockImage();
sourceBmp.LockImage();
//Key points
PointF A = (PointF)topleft;
PointF B = (PointF)topright;
PointF C = (PointF)bottomright;
PointF D = (PointF)bottomleft;
// sides
float mAB
float mCD
float mAD
float mBC

=
=
=
=

GetAngle(A,
GetAngle(C,
GetAngle(A,
GetAngle(B,


B);
D);
D);
C);

//Get corner intersections
PointF O = GetIntersection(new Vector(B, mAB), new
Vector(C, mCD));
PointF N = GetIntersection(new Vector(A, mAD), new
Vector(B, mBC));
if (interpolation <= 0) interpolation = 1;
int middleX = (int)(interpolation / 2.0);
//Array of surronding pixels used for interpolation
double[, ,] source = new double[interpolation,
interpolation, 4];
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
PointF P = new PointF(x, y);

8


float mPO = mAB; //Default value
float mPN = mBC;
get coefficient

if (O != PointF.Empty) //If intersection found,
mPO = GetAngle(O, P);


get coefficient

if (N != PointF.Empty) //If intersection found,
mPN = GetAngle(N, P);
//Get intersections
PointF L = GetIntersection(new Vector(P, mPO),

new Vector(A, mAD));

if (L == PointF.Empty) L = A;
PointF M = GetIntersection(new Vector(P, mPO),

new Vector(C, mBC));

if (M == PointF.Empty) M = C;
PointF J = GetIntersection(new Vector(P, mPN),

new Vector(B, mAB));

if (J == PointF.Empty) J = B;
PointF K = GetIntersection(new Vector(P, mPN),

new Vector(D, mCD));

if (K == PointF.Empty) K = D;
double dJP = GetDistance(J, P);
double dLP = GetDistance(L, P);
double dJK = GetDistance(J, K);
double dLM = GetDistance(L, M);

//set direction
if (dLM < GetDistance(M, P)) dLP = -dLP;
if (dJK < GetDistance(K, P)) dJP = -dJP;
////interpolation
//find the pixels which surround the point
double yP0 = sourceHeight * dJP / dJK;
double xP0 = sourceWidth * dLP / dLM;
//top left coordinates of surrounding pixels
if (xP0 < 0) xP0--;
if (yP0 < 0) yP0--;

9


int left = (int)xP0;
int top = (int)yP0;
if ((left < -1 || left > sourceWidth) && (top <
-1 || top > sourceHeight))
{
//if outside of source image just move on
continue;
}
//weights
double xFrac = xP0 - (double)left;
double xFracRec = 1.0 - xFrac;
double yFrac = yP0 - (double)top;
double yFracRec = 1.0 - yFrac;
//get source pixel colors, or white if out of
range (to interpolate into the background color)
int x0;

int y0;
Color c;
for (int sx = 0; sx < interpolation; sx++)
{
for (int sy = 0; sy < interpolation; sy++)
{
x0 = left + sx;
y0 = top + sy;
if (x0 > 0 && y0 > 0 &&
x0 < sourceWidth && y0 <
sourceHeight)

{
c = sourceBmp.GetPixel(x0, y0);
source[sx,
source[sx,
source[sx,
source[sx,
}
else
{

case

sy,
sy,
sy,
sy,

0]

1]
2]
3]

=
=
=
=

c.R;
c.G;
c.B;
255.0f;

// set full transparency in this
source[sx, sy, 0] = 0;
source[sx, sy, 1] = 0;
source[sx, sy, 2] = 0;

10


}
}

source[sx, sy, 3] = 0;

}

//interpolate on x

for (int sy = 0; sy < interpolation; sy++)
{
//check transparency
if (source[middleX, sy, 3] != 0 && source[0,
sy, 3] == 0)

{

}
else
{
xFracRec + source[middleX,
xFracRec + source[middleX,
xFracRec + source[middleX,
xFracRec + source[middleX,
}

//copy colors
source[0, sy,
source[0, sy,
source[0, sy,
source[0, sy,

from
0] =
1] =
2] =
3] =

//compute colors

source[0, sy, 0]
sy, 0] * xFrac;
source[0, sy, 1]
sy, 1] * xFrac;
source[0, sy, 2]
sy, 2] * xFrac;
source[0, sy, 3]
sy, 3] * xFrac;

1, sy
source[1,
source[1,
source[1,
source[1,

sy,
sy,
sy,
sy,

0];
1];
2];
3];

by interpolation
= source[0, sy, 0] *
= source[0, sy, 1] *
= source[0, sy, 2] *
= source[0, sy, 3] *


//interpolate transparency
source[0, sy, 3] = source[0, sy, 3] *
xFracRec + source[middleX, sy, 3] * xFrac;
}
//now interpolate on y
//check transparency
if (source[0, middleX, 3] != 0 && source[0, 0,
3] == 0)

{

}

//copy colors from 0, 1
source[0, 0, 0] = source[0,
source[0, 0, 1] = source[0,
source[0, 0, 2] = source[0,
source[0, 0, 3] = source[0,

middleX,
middleX,
middleX,
middleX,

0];
1];
2];
3];


11


else
{
+ source[0, middleX, 0]
+ source[0, middleX, 1]
+ source[0, middleX, 2]
+ source[0, middleX, 3]
}

source[0,
* yFrac;
source[0,
* yFrac;
source[0,
* yFrac;
source[0,
* yFrac;

0, 0] = source[0, 0, 0] * yFracRec
0, 1] = source[0, 0, 1] * yFracRec
0, 2] = source[0, 0, 2] * yFracRec
0, 3] = source[0, 0, 3] * yFracRec

//interpolate transparency
source[0, 0, 3] = source[0, 0, 3] * yFracRec +
source[0, middleX, 3] * yFrac;
//store to bitmap
if (source[0, 0, 3] != 0) //pixel has color

newBmp.SetPixel(x, y,
Color.FromArgb((int)source[0, 0, 3], (int)source[0, 0, 0],
(int)source[0, 0, 1], (int)source[0, 0, 2]));
}
}
sourceBmp.UnlockImage();
newBmp.UnlockImage();
return bitmap;
}

12


CHƯƠNG 4: GIAO DIỆN CHƯƠNG TRÌNH
4.1.

Giao diện khi mở ảnh

Hình 4.1: Giao diện khi mở ảnh

4.2.

Giao diện khi chỉnh sửa ảnh

Hình 4.2: Giao diện khi chỉnh sửa ảnh

13


CHƯƠNG 5: KẾT QUẢ VÀ HƯỚNG PHÁT TRIỂN

5.1.

Kết quả

 Hiểu được tầm quan trọng của xử lý ảnh và ứng dụng của môn học trong
việc giải quyết các vấn đề thực tế;
 Nắm được những kiến thức cơ bản về xử lý ảnh và áp dụng vào giải
quyết các bài toán cụ thể
5.2.

Hướng phát triển

 Phát triển đề tài thêm nhiều tính năng mới, hoàn thiện hơn;
 Sử dụng bài toán để giải quyết một số yêu cầu trong thực tế.

14


TÀI LIỆU THAM KHẢO

1

Slide bài giảng “Xử Lý Ảnh”, TS. Đào Nam Anh, Trường Đại Học
Điện Lực, 2014

2

Visual C# Kicks – High-quality .NET articles and components,



15


NHẬN XÉT, ĐÁNH GIÁ CỦA GIÁO VIÊN

16



×