You are on page 1of 20

Trường Đại học Khoa học Tự nhiên

Đại học Quốc gia Thành phố Hồ Chí Minh

Đồ án 2: Image processing

Ngày 30 tháng 7 năm 2023

Author

Nguyễn Việt Kim - 21127333

1
Toán ứng dụng và thống kê cho Công nghệ thông tin

Mục lục

1 Lời mở đầu 3

2 Mô tả chương trình 3
2.1 Ý tưởng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 Mô tả hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2.1 Các thư viện được sử dụng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2.2 Các hàm Input/Ouput hình ảnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.3 Hàm thay đổi độ sáng của ảnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.4 Thay đổi độ tương phản của ảnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.5 Lật ảnh (dọc/ngang) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.6 Chuyển hình ảnh thành Grayscale/Sepia . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.7 Làm mờ / sắc nét ảnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.8 Cắt ảnh theo kích thước . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.9 Cắt ảnh theo khung hình tròn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.10 Cắt ảnh theo 2 khung hình elip chéo nhau . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.11 Hàm main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3 Kết quả test case 14

4 Tài liệu tham khảo 20

21127333 - Nguyễn việt Kim 2


Toán ứng dụng và thống kê cho Công nghệ thông tin

1 Lời mở đầu

Em tên là Nguyễn Việt Kim, MSSV 21127333 đang là học sinh lớp 21CLC08 thuộc khoa Công nghệ
thông tin chương trình chất lượng cao, Đại học Khoa Học Tự Nhiên, Đại học quốc gia thành phố Hồ
Chí Minh
Sau đây là báo cáo về Đồ án 2 - Image Processing sử dụng các phép toán với ma trận và các phép
toán về hình học để xử lí màu RGB bằng ma trận và lưu hình ảnh sau khi xử lí. Đồ án được viết bằng
ngôn ngữ lập trình Python và sử dụng các thư viện toán học và xử lí hình ảnh có sẵn trong Python,
bao gồm matplotlib và numpy.

2 Mô tả chương trình

2.1 Ý tưởng

Hình ảnh là ma trận 2 chiều gồm các điểm ảnh là các ma trận con với kích thước là 3 dùng để lưu trữ
hệ màu RGB dưới dạng các số thể hiện cho các chỉ số Red(đỏ), Green(xanh lá) và Blue(xanh lam).
Bằng cách thay đổi các chỉ số đó (riêng lẻ hoặc theo ma trận) ta sẽ được hình ảnh được xử lí theo yêu
cầu. Chương trình sẽ sử dụng các phép toán với số, theo hình học hoặc theo ma trận để thực hiện xử
lí hình ảnh.

2.2 Mô tả hàm

Trong phần này, các hàm sẽ được mô tả cách thức và chức năng trong chương trình.
Các chức năng đã hoàn thành:

No. Chức năng Mức độ hoàn thành


1 Hàm đọc file ảnh 100%
2 Hàm xuất file ảnh 100%
3 Hàm thay đổi độ sáng của ảnh 100%
4 Hàm thay đổi độ tương phản của ảnh 100%
5 Hàm lật ảnh 100%
6 Hàm chuyển hình ảnh thành grayscale / sepia 100%
7 Hàm làm mờ ảnh 100%
8 Hàm làm sắc nét ảnh 100%
9 Hàm cắt ảnh theo kích thước 100%
10 Hàm cắt ảnh theo khung hình tròn 100%
11 Hàm cắt ảnh theo khung là 2 hình elip 100%
12 Hàm main 100%

2.2.1 Các thư viện được sử dụng

Đoạn chương trình sau đây là các thư viện được sử dụng trong Python dùng cho các thuật toán và
xử lí input/output của các hình ảnh.
1 import numpy as np
2 import matplotlib as mpl

21127333 - Nguyễn việt Kim 3


Toán ứng dụng và thống kê cho Công nghệ thông tin

3 import matplotlib . pyplot as plt

Listing 1: Các thư viện được sử dụng

2.2.2 Các hàm Input/Ouput hình ảnh

Hàm read_image() sử dụng thư viện Image của PIL để đọc hình ảnh và sau đó định dạng ảnh từ các
hệ màu khác thành hệ màu RGB và chuyển về thành dạng array của numpy để sử dụng cho việc xử
lí hình ảnh. Ảnh được chuyển đổi dưới dạng mảng 2 chiều các pixel theo kích thước của ảnh. Mỗi
pixel là một mảng để lưu trữ 3 giá trị thể hiện cho 3 chỉ số của hệ màu RGB theo thứ tự là Red(đỏ),
Green(xanh lá) và Blue(xanh lam).
1 # Read image
2 def read_image () :
3 filename = input ( " Enter name of the file : " )
4

5 img = Image . open ( filename )


6 img = img . convert ( ’ RGB ’)
7 img = np . asarray ( img )
8

9 return img

Listing 2: Hàm đọc hình ảnh

Hàm sau sẽ cho người dùng thực hiện lưu ảnh với tên file đã định sẵn dưới định dạng ảnh .png:
1 def export_image ( img , filename ) :
2 img = Image . fromarray ( img )
3 img . save ( filename + " . png " )

Listing 3: Hàm xuất hình ảnh

2.2.3 Hàm thay đổi độ sáng của ảnh

Brightness là độ sáng của ảnh. Độ sáng của ảnh được thay đổi bởi sự thay đổi chung của tất cả các
pixel trên ảnh. Điều này được thực hiện bởi việc cộng từng chỉ số màu của từng pixel với độ sáng
tương ứng. Ta có thể giảm độ sáng hoặc tăng độ sáng với hệ số màu thỏa mãn luôn lớn hơn 0 và nhỏ
hơn 255.
1 def chan ge_brightness ( img , brightness ) :
2 new_img = np . zeros ( img . shape , img . dtype )
3

4 for y in range ( img . shape [0]) :


5 for x in range ( img . shape [1]) :
6 for z in range ( img . shape [2]) :
7 new_img [ y ][ x ][ z ] = max ( min ( img [ y ][ x ][ z ] + brightness , 255) , 0)
8

9 return new_img

Listing 4: Hàm thay đổi độ sáng của ảnh

2.2.4 Thay đổi độ tương phản của ảnh

Khác với độ sáng của ảnh, độ tương phản (contrast) là độ chênh lệch (sự khác nhau) giữa các màu
sáng và tối trong hình ảnh. Điều này có được bằng cách tăng độ sáng của các màu sáng và giảm độ

21127333 - Nguyễn việt Kim 4


Toán ứng dụng và thống kê cho Công nghệ thông tin

tối của các màu tối hơn theo độ tương phản được yêu cầu.

Công thức tính độ sáng mới của điểm ảnh như sau:

i − i mi n
i p = 255 ×
i max − i mi n

Với ip là độ sáng mới (new luminosity) của điểm ảnh, i (luminosity) là độ sáng hiện lại của ảnh được
tính với công thức i = R+G+B
3 , trong đó R G B là các màu cơ bản của pixel, imin và imax lần lượt là độ
sáng nhỏ nhất là lớn nhất (min luminosity, max luminosity).

Màu mới của điểm ảnh sẽ được tính dựa trên công thức sau:

ip
x=x×
i

Với x là màu cơ bản của điểm ảnh (R, G, B).

Đoạn code để thay đổi độ tương phản của bức ảnh như sau:
1 def change_contrast ( img , intensity ) :
2 new_img = np . zeros ( img . shape , img . dtype )
3 luminosity = np . zeros (( img . shape [0] , img . shape [1]) , img . dtype )
4 intensity = intensity / 100 + 1
5

6 # Get sum of R , G , B in img


7 # The sum_color is a 2 d array contains index of sum of the pixel ’s color in img
8 for y in range ( img . shape [0]) :
9 for x in range ( img . shape [1]) :
10 luminosity [ y ][ x ] = sum ( img [ y ][ x ]) / 3
11

12 imin = np . amin ( luminosity )


13 imax = np . amax ( luminosity )
14

15 for y in range ( img . shape [0]) :


16 for x in range ( img . shape [1]) :
17 for z in range ( img . shape [2]) :
18 new_img [ y ][ x ][ z ] = min ( intensity * img [ y ][ x ][ z ] * (255 * ( luminosity [
y ][ x ] - imin ) / ( imax - imin ) ) / luminosity [ y ][ x ] , 255)
19

20 return new_img

Listing 5: Hàm thay đổi độ tương phản của ảnh

2.2.5 Lật ảnh (dọc/ngang)

Vì ảnh là mảng 2 chiều của các điểm ảnh thể hiện cho từng màu của điểm ảnh, ảnh có thể được lật
bằng cách đổi chỗ các điểm ảnh với nhau (đổi giá trị màu giữa các điểm ảnh).

Người dùng sẽ nhập từ bàn phím lựa chọn ’h’ (horizontal) hoặc ’v’ (vertical) để thực hiện lật ảnh
theo chiều ngang hoặc chiều dọc. Chương trình sẽ thực hiện đổi chiều của mảng dựa trên yêu cầu từ
người dùng.

21127333 - Nguyễn việt Kim 5


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hàm để thực thi lật ảnh:


1 def flip_image ( img ) :
2 direction = input ( " Enter ’h ’ for horizontal flip , ’v ’ for vertical flip " )
3 new_img = np . zeros ( img . shape , img . dtype )
4 if direction == ’v ’:
5 new_img = img [:: -1]
6 elif direction == ’h ’:
7 for i in range ( len ( img ) ) :
8 new_img [ i ] = img [ i ][:: -1]
9 return new_img

Listing 6: Hàm lật ảnh (dọc/ngang)

2.2.6 Chuyển hình ảnh thành Grayscale/Sepia

Chuyển hình ảnh từ màu RGB thành grayscale được thực viện bằng cách nhân 2 ma trận sau với
nhau:  
h i 0.299 0.299 0.299

R G B ×
0.587 0.587 0.587

0.114 0.114 0.114

Công thức trên tương đương với:

x = R × 0.299 +G × 0.587 + B × 0.114

Với x lần lượt là các hệ số màu R, G, B của điểm ảnh.

Hàm để chuyển đổi hình ảnh về dạng grayscale là:


1 def rgb_2_gray ( img ) :
2 new_img = np . zeros ( img . shape , img . dtype )
3 R = np . array ( img [: , : , 0]) * 0.299
4 G = np . array ( img [: , : , 1]) * 0.587
5 B = np . array ( img [: , : , 2]) * 0.114
6

7 Avg = ( R + G + B )
8

9 for i in range (3) :


10 new_img [: ,: , i ] = Avg
11 return new_img

Listing 7: Hàm chuyển ảnh thành grayscale

Đối với chuyển ảnh từ RGB thành sepia, công thức để sử dụng chuyển đổi này là nhân 2 ma trận sau
với nhau:  
h i 0.393 0.349 0.272

R G B ×
0.769 0.686 0.534

0.189 0.168 0.131

Công thức trên tương đương với:

NewRed = 0.393 × R + 0.769 ×G + 0.189 × B

NewGr een = 0.349 × R + 0.686 ×G + 0.168 × B

21127333 - Nguyễn việt Kim 6


Toán ứng dụng và thống kê cho Công nghệ thông tin

NewBl ue = 0.272 × R + 0.534 ×G + 0.131 × B

Hàm để chuyển đổi hình ảnh thành dạng sepia là:


1 def rgb_2_sepia ( img ) :
2 R ,G , B = img [: ,: ,0] , img [: ,: ,1] , img [: ,: ,2]
3

4 NewRed = 0.393* R + 0.769* G + 0.189* B


5 NewGreen = 0.349* R + 0.686* G + 0.168* B
6 NewBlue = 0.272* R + 0.534* G + 0.131* B
7

8 for y in range ( img . shape [0]) :


9 for x in range ( img . shape [1]) :
10 for z in range ( img . shape [2]) :
11 if img [ y ][ x ][ z ] > 255:
12 img [ y ][ x ][ z ] = 255
13 new_img = ( np . dstack (( NewRed , NewGreen , NewBlue ) ) ) . astype ( np . uint8 )
14

15 return new_img

Listing 8: Hàm chuyển ảnh thành serpia

2.2.7 Làm mờ / sắc nét ảnh

Làm mờ và sắc nét ảnh sử dụng ý tưởng về kernel cho ma trận.

Hình 1: Minh họa cho ý tưởng về kernel

21127333 - Nguyễn việt Kim 7


Toán ứng dụng và thống kê cho Công nghệ thông tin

Cho ma trận kernel cho làm mờ như sau:


 
1 1 1
 91 9
1
9
1
box _ker nel =
9 9 9
1 1 1
9 9 9

và ma trận kernel cho làm sắc nét ảnh như sau:


 
0 − 21 0
 1
− 12 

shar peni ng _ker nel = 
− 2 3 
0 − 12 0

Bằng cách nhân ma trận kernel và ma trận được tạo bởi các ô xung quanh ô được chọn thỏa ô được
chọn là ô ở giữa và kích thước của ma trận được chọn bằng với kích thước của ma trận kernel, ta sẽ
được ô mới tại vị trí đã chọn.

Hình 2: Cách nhân với ma trận kernel

Hàm làm mờ / sắc nét ảnh:


1 # Define kernel matrix for blur
2 # box kernel
3 box_kernel = [[1 / 9 , 1 / 9 , 1 / 9] ,
4 [1 / 9 , 1 / 9 , 1 / 9] ,
5 [1 / 9 , 1 / 9 , 1 / 9]]
6

7 # sharpening kernel
8 sharp ening_kernel = [[ 0 , -.5 , 0 ],
9 [ -.5 , 3 , -.5 ] ,
10 [ 0 , -.5 , 0 ]]
11

12 def blur_sharpening ( img , kernel ) :


13 new_img = np . zeros ( img . shape , img . dtype )
14

15 # Middle of the kernel


16 offset = len ( kernel ) // 2
17

18 # Apply blur to each channel separately and add them together


19 for y in range ( offset , img . shape [0] - offset ) :
20 for x in range ( offset , img . shape [1] - offset ) :
21 R, G, B = 0, 0, 0
22 for i in range ( len ( kernel ) ) :
23 for j in range ( len ( kernel ) ) :
24 R += img [ y + i - offset ][ x + i - offset ][0] * kernel [ i ][ j ]

21127333 - Nguyễn việt Kim 8


Toán ứng dụng và thống kê cho Công nghệ thông tin

25 G += img [ y + i - offset ][ x + i - offset ][1] * kernel [ i ][ j ]


26 B += img [ y + i - offset ][ x + i - offset ][2] * kernel [ i ][ j ]
27

28 new_img [ y ][ x ] = [R ,G , B ]
29

30 return new_img

Listing 9: Hàm làm mờ / sắc nét ảnh

2.2.8 Cắt ảnh theo kích thước

Ảnh được cắt theo hình chữ nhật với kích thước được người dùng nhập trước. Bằng cách khởi tạo với
kích thước đã nhập từ người dùng, chương trình sẽ tạo một ma trận với kích thước mới với giá trị
màu được lấy từ trung tâm của hình cũ.

Hàm cắt ảnh theo kích thước từ trung tâm là:


1 def crop_center ( img , height , width ) :
2 new_img = np . zeros (( height , width , img . shape [2]) , img . dtype )
3

4 dist_top = int (( img . shape [0] - height ) / 2)


5 dist_left = int (( img . shape [1] - width ) / 2)
6

7 for y in range ( new_img . shape [0]) :


8 for x in range ( new_img . shape [1]) :
9 new_img [ y ][ x ] = img [ y + dist_top ][ x + dist_left ]
10

11 return new_img

Listing 10: Hàm cắt ảnh từ trung tâm theo hình chữ nhật

2.2.9 Cắt ảnh theo khung hình tròn

Người dùng sẽ được nhập bán kính của khung hình tròn và bằng thuật toán Euclidean tính khoảng
các điểm trong tọa độ mặt phẳng, những điểm ảnh nằm trong bán kính đường tròn sẽ được gán giá
trị màu cho ma trận mới. Các điểm khác sẽ được gán màu đen (0, 0, 0).

Hàm tính khoảng cách Euclidean:


1 def Euclidean (A , B ) :
2 return np . sqrt ( pow ( A [0] - B [0] , 2) + pow ( A [1] - B [1] , 2) )

Listing 11: Hàm tính khoảng cách Euclidean

Hàm cắt ảnh theo khung hình tròn là:


1 def crop_circle ( img , rad ) :
2 new_img = np . zeros ( img . shape , img . dtype )
3

4 center = [ int ( img . shape [0] / 2) , int ( img . shape [1] / 2) ]


5

6 for y in range ( img . shape [0]) :


7 for x in range ( img . shape [1]) :
8 if ( Euclidean ([ x , y ] , [ center [1] , center [0]]) <= rad ) :
9 new_img [ y ][ x ] = img [ y ][ x ]

21127333 - Nguyễn việt Kim 9


Toán ứng dụng và thống kê cho Công nghệ thông tin

10 else :
11 new_img [ y ][ x ] = [0 , 0 , 0]
12

13 return new_img

Listing 12: Hàm cắt ảnh theo khung hình tròn

2.2.10 Cắt ảnh theo 2 khung hình elip chéo nhau

Ý tưởng giống như cắt ảnh theo hình tròn, các điểm ảnh nằm trong khu vực của hình elip sẽ được
gán giá trị cho ma trận ảnh mới. Các điểm ảnh được chọn dựa thỏa bất phương trình sau:

A × x 2 + B × x × y +C × y 2 ≤ 1

Với:
cos(α)2 si n(α)2
A= +
a2 b2
1 1
B = 2 × cos(α) × si n(α) × ( − )
a2 b2
si n(α)2 cos(α)2
C= +
a2 b2
Trong đó a là độ dài nửa trục chính của hình elip, b là độ dài của nửa trục phụ của elip, α là góc xoay
của trục chính so với mặt phẳng Ox trong hệ tọa độ Oxy. Trục chính của 2 hình elip là đường thẳng
từ tâm hình đến 2 góc trên thuộc mặt phẳng thứ I và thứ IV của hình theo trục tọa độ Oxy với tâm O
là tâm của hình. Khi đó sin và cos của góc α sẽ được tính bằng hàm sau:
1 def sin (A , B ) :
2 return ( np . abs ( B [1] - A [1]) / Euclidean (A , B ) )
3

4 def cos (A , B ) :
5 return ( np . abs ( B [0] - A [0]) / Euclidean (A , B ) )

Listing 13: Tính sin và cos của góc α

Và hình sẽ được cắt bởi hàm sau:


1 def ellipses_crop ( img , size ) :
2 new_img = np . zeros ( img . shape , img . dtype )
3

4 # Main axis = 2 a
5 # Minor axis = 2 b
6 # Distance between a focus point and centre
7 # In this crop , it ’s best to choose b = a / 2
8 centre = [ int ( img . shape [1] / 2) , int ( img . shape [0] / 2) ]
9 a_square = int (( size / 100) * ( pow ( img . shape [0] , 2) + pow ( img . shape [1] , 2) ) / 4)
10 b_square = int ( a_square / 4)
11

12 sin_axis1 = sin ( centre , [ img . shape [1] , img . shape [0]])


13 cos_axis1 = cos ( centre , [ img . shape [1] , img . shape [0]])
14 sin_axis2 = - sin_axis1
15 cos_axis2 = cos_axis1
16

17 #
18 A1 = pow ( cos_axis1 , 2) / a_square + pow ( sin_axis1 , 2) / b_square
19 B1 = 2 * cos_axis1 * sin_axis1 * (1 / a_square - 1 / b_square )

21127333 - Nguyễn việt Kim 10


Toán ứng dụng và thống kê cho Công nghệ thông tin

20 C1 = pow ( sin_axis1 , 2) / a_square + pow ( cos_axis1 , 2) / b_square


21

22 A2 = pow ( cos_axis2 , 2) / a_square + pow ( sin_axis2 , 2) / b_square


23 B2 = 2 * cos_axis2 * sin_axis2 * (1 / a_square - 1 / b_square )
24 C2 = pow ( sin_axis2 , 2) / a_square + pow ( cos_axis2 , 2) / b_square
25

26 for y in range ( img . shape [0]) :


27 for x in range ( img . shape [1]) :
28 if ( A1 * pow ( x - centre [0] , 2) + B1 *( x - centre [0]) *( y - centre [1]) + C1 * pow
( y - centre [1] , 2) ) <= 1:
29 new_img [ y ][ x ] = img [ y ][ x ]
30 if ( A2 * pow ( x - centre [0] , 2) + B2 *( x - centre [0]) *( y - centre [1]) + C2 * pow
( y - centre [1] , 2) ) <= 1:
31 new_img [ y ][ x ] = img [ y ][ x ]
32

33

34 return new_img

Listing 14: Hàm cắt ảnh theo 2 khung hình elip chéo nhau

2.2.11 Hàm main

Hàm executing_mode() sẽ thực hiện các yêu cầu của người dùng nhập vào với số từ 1-10 ứng với
từng chức năng và trả về ma trận hình ảnh sau khi được xử lí:
1 def executing_mode ( img , mode ) :
2 # Change brightness of the image
3 if mode == 1:
4 # Input brightness percentage
5 # The brightness comes in range ( -100 , 100) with negative for darken and
positive for brighten the image
6 brightness = int ( input ( " Choose brightness between -100 to 100: " ) )
7 while ( brightness < 0 or brightness > 100) :
8 brightness = int ( input ( " Invalid input ! Brightness should be within -100
to +100 " ) )
9

10 return ( change_brightness ( img , brightness ) )


11

12 # Change contrast of the image


13 elif mode == 2:
14 # Input contrast
15 co nt rast_intensity = int ( input ( " Choose contrast intensity from -100 to 100: "
))
16 while ( contrast_intensity < -100 or contrast_intensity > 100) :
17 contrast_intensity = int ( input ( " Invalid input ! Contrast should be within
-100 to +100 " ) )
18

19 return ( change_contrast ( img , contrast_intensity ) )


20

21 # Flip image
22 elif mode == 3:
23 return ( flip_image ( img ) )
24

25 # Convert image to Grayscale


26 elif mode == 4:
27 return ( rgb_2_gray ( img ) )

21127333 - Nguyễn việt Kim 11


Toán ứng dụng và thống kê cho Công nghệ thông tin

28

29 # Convert image to sepia


30 elif mode == 5:
31 return ( rgb_2_sepia ( img ) )
32

33 # Blur image
34 elif mode == 6:
35 return ( blur_sharpening ( img , box_kernel ) )
36

37 # Sharpening image
38 elif mode == 7:
39 return ( blur_sharpening ( img , sharpening_kernel ) )
40

41 # Crop image in square mode :


42 elif mode == 8:
43 height = int ( input ( " Enter height of crop image : " ) )
44 width = int ( input ( " Enter width of crop image : " ) )
45

46 return ( crop_center ( img , height , width ) )


47

48 # Crop image in circle shape


49 elif mode == 9:
50 radius = int ( input ( " Enter circle radius : " ) )
51

52 return ( crop_circle ( img , radius ) )


53

54 # Crop image in ellipses


55 elif mode == 10:
56 size = int ( input ( ’ Enter size of the ellipses from 0 to 100: ’) )
57 while ( size < 0 or size > 100) :
58 size = int ( input ( ’ Please enter valid size of the ellipses from 0 to 100:
’) )
59

60 return ( ellipses_crop ( img , size ) )

Listing 15: Hàm executing_mode

Hàm main() sẽ gọi đến hàm read_image() và cho người dùng nhập tên file ảnh muốn chỉnh sửa. Sau
đó người dùng sẽ được nhập mode ứng với từng chức năng từ 0-10. Với mode = 0, chương trình sẽ
thực hiện tất cả chức năng và lưu dưới dạng file ảnh .png. Với các mode khác, chương trình sẽ hiện
ảnh cho người dùng thấy được.
1 if __name__ == " __main__ " :
2 """
3 Choose from 0 to 10 for each feature :
4 0 - Do all the below functions and save into files
5 1 - Change brightness
6 2 - Change contrast
7 3 - Flip image
8 4 - Convert to grayscale
9 5 - Convert to sepia
10 6 - Blur image
11 7 - Sharpen image
12 8 - Crop image in square shape
13 9 - Crop image in circle shape
14 10 - Crop image in 2 ellipses

21127333 - Nguyễn việt Kim 12


Toán ứng dụng và thống kê cho Công nghệ thông tin

15 """
16 # Read the image
17 img = read_image ()
18

19 mode = int ( input ( " Choose mode for image modifying : " ) )
20 while ( mode < 0 or mode > 10) :
21 mode = int ( input ( " Please enter valid choice of mode " ) )
22

23 if mode == 0:
24 for i in range (1 , 11) :
25 if i == 1:
26 mode_name = " brightness "
27 elif i == 2:
28 mode_name = " contrast "
29 elif i == 3:
30 mode_name = " flip "
31 elif i == 4:
32 mode_name = " grayscale "
33 elif i == 5:
34 mode_name = " sepia "
35 elif i == 6:
36 mode_name = " blur "
37 elif i == 7:
38 mode_name = " sharpening "
39 elif i == 8:
40 mode_name = " crop_square "
41 elif i == 9:
42 mode_name = " crop_circle "
43 elif i == 10:
44 mode_name = " crop_ellipses "
45 export_image ( executing_mode ( img , i ) , mode_name )
46 else :
47 plt . imshow ( executing_mode ( img , mode ) )

Listing 16: Hàm main

21127333 - Nguyễn việt Kim 13


Toán ứng dụng và thống kê cho Công nghệ thông tin

3 Kết quả test case

File ảnh được test:

Hình 3: test.jpg

Ảnh được tăng độ sáng 40:

Hình 4: brightness.png

Ảnh được tăng độ tương phản 40:

21127333 - Nguyễn việt Kim 14


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hình 5: contrast.png

Ảnh được lật theo chiều dọc:

Hình 6: flip.png

Ảnh được chuyển thành ảnh xám (grayscale):

21127333 - Nguyễn việt Kim 15


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hình 7: grayscale.png

Ảnh được chuyển thành sepia

Hình 8: sepia.png

Ảnh được làm mờ:

21127333 - Nguyễn việt Kim 16


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hình 9: blur.png

Ảnh được làm sắc nét:

Hình 10: sharpening.png

Ảnh được cắt theo hình chữ nhật kích thước 300 × 300

21127333 - Nguyễn việt Kim 17


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hình 11: crop-square.png

Ảnh được cắt theo khung hình tròn với bán kính 300:

Hình 12: crop-circle.png

Ảnh được cắt theo 2 khung hình elip chéo nhau:

21127333 - Nguyễn việt Kim 18


Toán ứng dụng và thống kê cho Công nghệ thông tin

Hình 13: crop-ellipses.png

21127333 - Nguyễn việt Kim 19


Toán ứng dụng và thống kê cho Công nghệ thông tin

4 Tài liệu tham khảo

• Lighting and color concepts

• How to Convert an Image from RGB to Grayscale in Python

• Understanding Image Contrast Algorithms

• Image processing algorithms part 5: Contrast adjustment

• Basic Image Manipulation: Colors

• Basic Image Manipulation: Transformation

• Basic Image Manipulation: Filtering

• The algorithm to blur images (box blur) - Inside code

• Rotation of Axes (Ellipse)

21127333 - Nguyễn việt Kim 20

You might also like