Module/môn: CSI101x
Giới thiệu về khoa học máy tính
Số hiệu assignment: 1/3
Người điều phối của FUNiX: Phan Trường Lâm
Ngày ban hành: 04/2016
Bài assignment này đòi hỏi sinh viên phải dùng khoảng 2h làm để hoàn thành
Tương ứng với outcome môn học:
● CSI101x_o7
Hiểu về biến, cách khai báo, gán giá trị và sử dụng biến
trong lập trình.
Hiểu cách load, xử lý một điểm ảnh
● CSI101x_o8
Hiểu và sử dụng được cấu trúc lặp for
● CSI101x_o9
Hiểu, biết cách viết biểu thức tính toán trong lập trình
● CSI101x_o4
Gian lận là hình thức lấy bài làm của người khác và sử dụng như là mình làm
ra. Hình thức đó bao gồm những hành động như: copy thông tin trực tiếp từ
trang web hay sách mà không ghi rõ nguồn tham khảo trong tài liệu; gửi bài
assignment làm chung như là thành quả cá nhân; copy bài assignment của các
sinh viên khác cùng khóa hay khác khóa; ăn trộm hay mua bài assignment của
ai đó và gửi lên như là sản phẩm mình làm ra. Những sinh viên bị nghi ngờ gian
lận sẽ bị điều tra và nếu phát hiện là có gian lận thì sẽ phải chịu các mức phạt
theo quy định của Nhà trường.
Mọi tài nguyên copy hay điều chế từ bất cứ nguồn nào (VD: Internet,
sách) phải được đặt trong cặp dấu nháy kép và in nghiêng, với thông tin
tham khảo đầy đủ về nguồn tài liệu.
Bài làm của bạn sẽ được đưa vào phần mềm kiểm tra gian lận. Mọi hình
thức cố tình đánh lừa hệ thống phát hiện gian lận sẽ bị coi là Vi phạm
quy định trong thi cử.
Quy định nộp bài assignment
●
Sinh viên phải nộp bài trên hệ thống LMS và tuân theo các yêu cầu nộp
bài quy định trên đó.
Quy định đánh giá bài assignment
● Sinh viên không có bài assignment sẽ bị 0 (không) điểm bài
assignment.
● Các trường hợp gian lận sẽ bị đánh trượt cả môn.
========================
Assignment 1
Mục tiêu
Làm quen với lập trình:
- Biến, biểu thức tính toán
- Cấu trúc lặp
Các công cụ cần có
Web browser
Vào địa chỉ tham khảo [1] (link mở sang tab mới), vào
phần bài tập (Exercise) nào đó, sau đó gõ code vào ô
text và ấn nút Run để chạy.
Tài nguyên
Tham khảo
ĐỀ BÀI
Viết chương trình (đoạn code) bằng ngôn ngữ sử dụng trong khóa học
(Javascript) để lọc nhiễu cho một bức ảnh.
HƯỚNG DẪN
Bức ảnh ban đầu trông như sau:
1. Làm nhiễu ảnh
Một dạng nhiễu ảnh hay gặp là các chấm nhỏ li ti màu đen, đỏ, xanh trắng
che đi một phần ảnh gốc do giá trị Red, Green, Blue hoặc cả 3 giá trị bị
truyền sai hay không nhận được.
Đoạn code sau đây giả lập trường hợp ảnh bị "nhiễu" ngẫu nhiên:
image = new SimpleImage("flowers.jpg");
for (i = 0; i < 2000; i++) {
x = Math.floor(Math.random() * (width - 1));
y = Math.floor(Math.random() * (height - 1));
pixel = image.getPixel(x, y);
pixel.setRed(255);
pixel.setGreen(255);
pixel.setBlue(255);
}
for (i = 0; i < 2000; i++) {
x = Math.floor(Math.random() * (width - 1));
y = Math.floor(Math.random() * (height - 1));
pixel = image.getPixel(x, y);
pixel.setRed(255);
pixel.setGreen(0);
pixel.setBlue(0);
}
for (i = 0; i < 1000; i++) {
x = Math.floor(Math.random() * (width - 1));
y = Math.floor(Math.random() * (height - 1));
pixel = image.getPixel(x, y);
pixel.setRed(0);
pixel.setGreen(0);
pixel.setBlue(255);
}
// Your code is here
// End of your code
print(image)
Chạy đoạn code trên tại ô Text và nhấn nút Run để chạy. Kết quả nhận được
là ảnh sau:
2. Thuật toán lọc nhiễu
Thuật toán lọc nhiễu đơn giản nhất mà vẫn đạt hiệu quả tương đối cao là
"median filter" (lọc giá trị trung bình) được mô tả sau đây.
Bước 1: Lấy ra vùng ô vuông bức ảnh có kích thước 3x3 (9 pixels). Lấy các
giá trị Red, Green, Blue của mỗi pixel, lưu vào 3 mảng gồm 9 phần tử. Mỗi
mảng ứng với 1 màu red, green và blue. Mỗi phần tử của mảng là giá trị của
kênh màu tương ứng.
Cú pháp khai báo mảng trong JavaScript như sau:
var [tên_mảng] = {phần_tử_1, phần_tử_2, ..., phần_tử_n}
Ví dụ:
Bức ảnh kích thước 3x3 có các giá trị pixel như sau:
34, 56, 72
76, 123, 34
57, 28, 195
235, 213, 12
34, 76, 186
195, 46, 24
24, 59, 123
27, 244, 177
75, 93, 76
Ta khai báo mảng red:
var red = {34, 235, 24, 76, 34, 27, 57, 195, 75}
Tương tự với green và blue.
Bước 2: Sắp xếp các phần tử trong mảng theo thứ tự từ bé đến lớn. Cú
pháp để sắp xếp trong JavaScript như sau:
[tên_mảng].sort()
Ví dụ:
Với mảng được cho trong ví dụ ở bước 1. Sau câu lệnh:
red.sort()
ta nhận được kết quả là:
red = {24, 27, 34, 34, 57, 75, 76, 195, 235}
Bước 3: Lấy giá trị của phần tử ở chính giữa mảng nhận được, gán cho pixel
ở chính giữa vùng ảnh đang được duyệt.
Ví dụ:
Lấy giá trị chính giữa mảng red là 57, chính giữa mảng green là 93, chính
giữa mảng blue là 76 gán cho pixel chính giữa vùng ảnh 3x3 (được bôi vàng)
ở trên. Vùng ảnh sẽ trở thành:
34, 56, 72
76, 123, 34
57, 28, 195
235, 213, 12
57, 93, 76
195, 46, 24
24, 59, 123
27, 244, 177
75, 93, 76
Bước 4: Duyệt tất cả các vùng ảnh 3x3 trong bức ảnh và lặp lại các bước từ
1 đến 3.
Ví dụ:
Với ảnh 5x5 sau (mỗi p1, p2, ..., pn là các pixel thứ 1, thứ 2, ..., thứ n)
p1
p2
p3
p4
p5
p6
p7
p8
p9
p10
p11 p12 p13 p14 p15
p16 p17 p18 p19 p20
p21 p22 p23 p24 p25
Các vùng ảnh cần duyệt là:
Viết thêm đoạn code theo đúng các bước được mô tả trong thuật toán trên
vào đoạn giữa 2 dòng:
// Your code is here
// End of your code
Trong đoạn code cho sẵn ở phần 1. Chạy chương trình để được ảnh kết quả
gần giống ảnh nguyên dạng như sau:
MÔ TẢ SẢN PHẨM PHẢI NỘP
Sản phẩm là file mã nguồn của chương trình (file text), 1 ảnh được làm
nhiễu, 1 ảnh sau khi lọc nhiễu.
NƠI NỘP BÀI
Nộp theo hướng dẫn trên LMS
THANG ĐÁNH GIÁ (RUBRICS)
Tiêu chí (criteria)
Mô tả
CSI101x_o4: Hiểu về biến,
cách khai báo, gán giá trị và
sử dụng biến trong lập trình
CSI101x_o7: Hiểu cách load,
xử lý một điểm ảnh
Khai báo được 3 mảng ứng với 3
kênh màu
CSI101x_o8: Hiểu và sử
dụng được cấu trúc lặp for
Gán được giá trị các kênh màu
của pixel chính giữa vùng đang
duyệt bằng giá trị phần tử nằm
chính giữa mảng
Duyệt được hết các vùng ô vuông
3x3 trong ảnh dùng vòng lặp for
Điểm thành
phần
2
3
2
CSI101x_o9: Hiểu, biết cách
viết biểu thức tính toán
trong lập trình
Sử dụng được hàm sort() - 1
điểm
Cho ra kết quả ảnh nhiễu đúng 1 điểm
Cho ra kết quả ảnh sau khi lọc
nhiễu đúng - 1 điểm
3
Lưu ý: điểm thành phần cần làm tròn đến 0,5.
CSI101x - Giới thiệu về khoa học máy tính Assignment 1
- Xem thêm -