1. Trang chủ
  2. » Giáo Dục - Đào Tạo

TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT

94 733 13
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 94
Dung lượng 5,24 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤTCHƯƠNG 1: KỸ THUẬT BIẾN ĐỔI ẢNH SỐ CƠ BẢN1.1. Giới thiệu 1.1.1. Kiến thức cơ bản a. Ảnh kĩ thuật số (Digital image) b. Độ phân giải của ảnh (Resolution) c. Điểm ảnh (Pixel) d. Mức xám của ảnh (Grayscale) e. Ảnh màu 1.1.2. Hướng dẫn lập trình OpenCVPython1.2. Lập trình các phép biến đổi cơ bản của ảnh 1.2.1. Các phép xuất nhập ảnh và video a. Đọc hiển thị ảnh và ghi ảnh trong OpenCV b. Hiển thị ảnh bằng matplotlib c. Mở lưu từ camera và phát video 1.2.2. Các phép biến đổi và vẽ hình cơ bản a. Vẽ hình cơ bản b. Các phép biến đổi cơ bản 1.2.3. Các phép toán đại số trên ảnh 1.2.4. Các phép toán logic trên ảnh 1.3. Lập trình các phép toán tiền xử lý ảnh 1.3.1. Lọc ảnh là gì 1.3.2. Nguyên lý hoạt động của lọc ảnh 1.3.3. Lọc chập (Convolution) 1.3.4. Làm mờ ảnh (Blur) 1.3.5. Lập trình ứng dụng các phép lọc ảnh a. Lọc tuyến tính b. Biến đổi Fourier 1.3.6. Các phép nổi biên a. Hàm sử dụng b. Lọc Laplace và Sobel làm nổi biên c. Biến đổi ảnh Pyramids 1.3.7. Các phép biến đổi hình thái học1.4. Bài tập áp dụng CHƯƠNG 2: TRÍCH RÚT ĐẶC TRƯNG2.1. Phân đoạn theo biên ảnh 2.1.1. Giới thiệu phân đoạn ảnh 2.1.2. Một vài ứng dụng cụ thể trong phân vùng ảnh 2.1.3. Thuật toán phân vùng ảnh sử dụng hàm tìm đường đồng mức (Contours) 2.1.4. Bài tập mở rộng2.2. Phân đoạn ảnh theo ngưỡng 2.2.1. Phân vùng theo ngưỡng biên độ a. Dựa vào đặc tính vật lý của ảnh, có nhiều kỹ thuật phân vùng b. Việc chọn ngưỡng rất quan trọng, gồm các bước c. Ví dụ 2.2.2. Phân vùng ảnh bằng cách khoanh vùng với đường bao nhỏ nhất 2.2.3. Bài tập mở rộng2.3. Phân đoạn ảnh theo màu đồng nhất 2.3.1. Giới thiệu 2.3.2. Phân đoạn dùng thuật toán watershed 2.3.3. Phân đoạn loại nền dùng thuật toán grabCut a. Giới thiệu b. GrabCut Foreground c. Hướng dẫn 2.3.4. Thuật toán grabCut 2.3.5. Phát hiện góc (Corner Detection ) a. Tìm góc cạnh dùng thuật toán ShiTomasi 2.3.6. Bài tập mở rộng2.4. Trích chọn đặc trưng ảnh 2.4.1. Trích chọn đặc trưng dùng thuật toán SIFT (ScaleInvariant Feature Transform) a. Các bước thực hiện thuật toán SIFT b. Phát hiện các điểm cực trị ScaleSpace c. Định vị điểm nổi bật d. Xác định hướng cho các điểm nổi bật e. Mô tả các điểm nổi bật 2.4.2. Thuật toán SIFT2.5. Bài tập áp dụng a. Rút trích đặc trưng ảnh b. Tìm đường bao ảnh c. Cắt ảnh loại bỏ nền sử dụng mặt nạCHƯƠNG 3: PHÁT HIỆN ĐỐI TƯỢNG3.1. Hiệu chuẩn camera 3.1.1. Hiệu chuẩn webcam 3.1.2. Thuật toán chuẩn hóa camera3.2. Lập trình ứng dụng tìm xác định đối tượng trên ảnh 3.2.1. Xác định trọng tâm và đường bao của blob trên ảnh a. Blob là gì? b. Hoạt động để phát hiện Blob c. Lọc Blobs theo màu sắc, kích thước và hình dạng 3.2.2. Thuật toán xác định trọng tâm blob trên ảnh 3.2.3. Thuật toán xác định trọng tâm và đường bao blob trên ảnh3.3. Phát hiên đối tượng dùng biến đổi Hough 3.3.1. Phát hiện đường thẳng dùng phương pháp houghline 3.3.2. Khái niệm cơ bản về phương pháp Houghline 3.3.3. Hoạt động của phương pháp Houghline 3.3.4. Thí dụ về biến đổi Hough 3.3.5. Các ứng dụng của biến đổi Hough 3.3.6. Thuật toán biến đổi Hough 3.3.7. Bài tập mở rộng3.4. Khôi phục ảnh 3.4.1. Khôi phục ảnh bằng cách khử nhiễu 3.4.2. Kỹ thuật khôi phục ảnh Inpainting 3.4.3. Khôi phục ảnh HDR (High Dynamic Range)3.5. Bài tập áp dụngCHƯƠNG 4: NHẬN DẠNG ĐỐI TƯỢNG4.1. Nhận dạng sự giống nhau ảnh dùng phương pháp ánh xạ ảnh 4.1.1. Giới thiệu về nhận dạng đối tượng 4.1.2. Ánh xạ ảnh 4.1.3. Nhận dạng theo phương pháp ánh xạ Brute force với mô tả đặc trưng ORB 4.1.4. Ánh xạ theo mô tả đặc trưng SIFT 4.1.5. Bài tập mở rộng4.2. Nhận dạng đối tượng theo đường hình học 4.2.1. Nhận dạng theo đường hình học Epipolar 4.2.2. Xoay ảnh dựa vào đặc trưng cơ bản 4.2.3. Bài tập mở rộng4.3. Nhận dạng đối tượng theo cấu trúc 4.3.1. Nhận diện gương mặt sử dụng Haarcascade trên OpenCVCHƯƠNG 5: PHÁT HIỆN ĐỐI TƯỢNG5.1. Giới thiệu phân tích dữ liệu và nhận dạng mẫu 5.1.1. Nhận dạng mẫu 5.1.2. Thuật toán kNN5.2. Tìm và phát hiện chuyển động của đối tượng5.3. Tìm và phát hiện chuyển động theo hình học lập thể 5.3.2. Thuật toán xác định độ sâu ảnh5.4. Thuật toán khử nhiễu cục bộ để loại bỏ nhiễu trong ảnh 5.4.1. Giới thiệu hàm khử nhiễu cục bộ 5.4.2. Thuật toán loại nhiễu cục bộ

Trang 1

CHƯƠNG 1: KỸ THUẬT BIẾN ĐỔI ẢNH SỐ CƠ BẢN

1.1 Giới thiệu

1.1.1 Kiến thức cơ bản

a Ảnh kĩ thuật số (Digital image)

b Độ phân giải của ảnh (Resolution)

c Mở - lưu từ camera và phát video

1.2.2 Các phép biến đổi và vẽ hình cơ bản

a Vẽ hình cơ bản

b Các phép biến đổi cơ bản

1.2.3 Các phép toán đại số trên ảnh

1.2.4 Các phép toán logic trên ảnh

Trang 2

1.3.7 Các phép biến đổi hình thái học

1.4 Bài tập áp dụng

CHƯƠNG 2: TRÍCH RÚT ĐẶC TRƯNG

2.1 Phân đoạn theo biên ảnh

2.1.1 Giới thiệu phân đoạn ảnh

2.1.2 Một vài ứng dụng cụ thể trong phân vùng ảnh

2.1.3 Thuật toán phân vùng ảnh sử dụng hàm tìm đường đồng mức (Contours) 2.1.4 Bài tập mở rộng

2.2 Phân đoạn ảnh theo ngưỡng

2.2.1 Phân vùng theo ngưỡng biên độ

a Dựa vào đặc tính vật lý của ảnh, có nhiều kỹ thuật phân vùng

b Việc chọn ngưỡng rất quan trọng, gồm các bước

2.3.2 Phân đoạn dùng thuật toán watershed

2.3.3 Phân đoạn loại nền dùng thuật toán grabCut

a Giới thiệu

b GrabCut Foreground

c Hướng dẫn

2.3.4 Thuật toán grabCut

2.3.5 Phát hiện góc (Corner Detection )

a Tìm góc cạnh dùng thuật toán Shi-Tomasi

Trang 3

b Phát hiện các điểm cực trị Scale-Space

c Định vị điểm nổi bật

d Xác định hướng cho các điểm nổi bật

e Mô tả các điểm nổi bật

2.4.2 Thuật toán SIFT

2.5 Bài tập áp dụng

a Rút trích đặc trưng ảnh

b Tìm đường bao ảnh

c Cắt ảnh loại bỏ nền sử dụng mặt nạ

CHƯƠNG 3: PHÁT HIỆN ĐỐI TƯỢNG

3.1 Hiệu chuẩn camera

3.1.1 Hiệu chuẩn webcam

3.1.2 Thuật toán chuẩn hóa camera

3.2 Lập trình ứng dụng tìm xác định đối tượng trên ảnh

3.2.1 Xác định trọng tâm và đường bao của blob trên ảnh

a Blob là gì?

b Hoạt động để phát hiện Blob

c Lọc Blobs theo màu sắc, kích thước và hình dạng

3.2.2 Thuật toán xác định trọng tâm blob trên ảnh

3.2.3 Thuật toán xác định trọng tâm và đường bao blob trên ảnh

3.3 Phát hiên đối tượng dùng biến đổi Hough

3.3.1 Phát hiện đường thẳng dùng phương pháp houghline 3.3.2 Khái niệm cơ bản về phương pháp Houghline

3.3.3 Hoạt động của phương pháp Houghline

3.3.4 Thí dụ về biến đổi Hough

3.3.5 Các ứng dụng của biến đổi Hough

3.3.6 Thuật toán biến đổi Hough

3.3.7 Bài tập mở rộng

3.4 Khôi phục ảnh

3.4.1 Khôi phục ảnh bằng cách khử nhiễu

Trang 4

3.4.2 Kỹ thuật khôi phục ảnh Inpainting

3.4.3 Khôi phục ảnh HDR (High Dynamic Range)

3.5 Bài tập áp dụng

CHƯƠNG 4: NHẬN DẠNG ĐỐI TƯỢNG

4.1 Nhận dạng sự giống nhau ảnh dùng phương pháp ánh xạ ảnh

4.1.1 Giới thiệu về nhận dạng đối tượng

4.1.2 Ánh xạ ảnh

4.1.3 Nhận dạng theo phương pháp ánh xạ Brute force với mô tả đặc trưng ORB 4.1.4 Ánh xạ theo mô tả đặc trưng SIFT

4.1.5 Bài tập mở rộng

4.2 Nhận dạng đối tượng theo đường hình học

4.2.1 Nhận dạng theo đường hình học Epipolar

4.2.2 Xoay ảnh dựa vào đặc trưng cơ bản

4.2.3 Bài tập mở rộng

4.3 Nhận dạng đối tượng theo cấu trúc

4.3.1 Nhận diện gương mặt sử dụng Haar-cascade trên OpenCV

CHƯƠNG 5: PHÁT HIỆN ĐỐI TƯỢNG

5.1 Giới thiệu phân tích dữ liệu và nhận dạng mẫu

5.1.1 Nhận dạng mẫu

5.1.2 Thuật toán k-NN

5.2 Tìm và phát hiện chuyển động của đối tượng

5.3 Tìm và phát hiện chuyển động theo hình học lập thể

5.3.2 Thuật toán xác định độ sâu ảnh

5.4 Thuật toán khử nhiễu cục bộ để loại bỏ nhiễu trong ảnh

5.4.1 Giới thiệu hàm khử nhiễu cục bộ

5.4.2 Thuật toán loại nhiễu cục bộ

Trang 5

KỸ THUẬT BIẾN ĐỔI ẢNH SỐ CƠ BẢN 1.1 Giới thiệu

1.1.1 Kiến thức cơ bản

a Ảnh kĩ thuật số (Digital image)

Ảnh kĩ thuật số (digital image) là một dạng biểu diễn của ảnh ở dạng ma trận số 2 chiều Tùy vào độ phân giải của ảnh có cố định hay không, ảnh kĩ thuật số được chia ra làm 2 loại là ảnh vector (độ phân giải không cố định) và ảnh raster (hay còn gọi là bitmapped, độ phân giải

cố định) Thuật ngữ ảnh kĩ thuật số thường được dùng để nói đến ảnh raster

b Độ phân giải của ảnh (Resolution)

Độ phân giải ảnh là mức độ chi tiết mà ảnh có thể thể hiện Thuật ngữ này được dùng cho ảnh raster Độ phân giải càng cao, ảnh càng nhiều chi tiết Ví dụ: độ phân giải 640 x 480

c Điểm ảnh (Pixel)

Trong ảnh kĩ thuật số, một điểm ảnh (pixel) là phần tử nhỏ nhất của ảnh raster (raster image) Mỗi một điểm ảnh là một mẫu (sample) của ảnh Càng nhiều điểm ảnh, ảnh kĩ thuật số càng biểu diễn chính xác hơn về nội dung của ảnh gốc Đặc trưng của một điểm ảnh gồm 2 thành phần: tọa độ (x,y) và cường độ sáng (intensity)

d Mức xám của ảnh (Grayscale)

Mức xám của ảnh (greyscale) là một trong những giá trị số của điểm ảnh biểu diễn mức

độ ánh sáng (light intensity) tại điểm ảnh đó Thông thường, trong xử lý ảnh hiện tại, mức xám hay sử dụng nhất là mức 256 (có giá trị mức xám từ 0 → 255)

e Ảnh màu

Để biểu diễn ảnh màu, theo cách biểu diễn RGB, ba ma trận mức xám 256, ứng với ba màu đỏ (R), lục (G), lam(B) được sử dụng Màu sắc của một điểm ảnh được quyết định bởi giá trị cường độ (intensity) tại ba ma trận màu cùng tọa độ

1.1.2 Hướng dẫn lập trình OpenCV-Python

Để có thể lập trình ứng dụng OpenCV vào thị giác máy tính ta cần hiểu lệnh, hàm, thư viện… trong OpenCV, sau đây là một chương trình đơn giản dùng ngôn ngữ python sử dụng thư viện OpenCV

Trang 6

− cv2.waitKey(0): Sau khi hiển thị nội dung ảnh, bằng lệnh cv2.waitKey(0), chương trình sẽ chờ cho đến khi người dùng nhấn một phím bất kì rồi mới thoát khỏi chương trình

− cv2.destroyAllWindows(): Xóa tất cả các cửa sổ nhưng không tạo ra bất kỳ sự thay đổi nào trong code này Các cửa sổ sẽ bị xóa do code đã hoàn thành việc thực thi, nhưng nếu chúng ta có một chương trình lớn hơn và sau đó có một số dòng code khác đang chạy, thì các cửa sổ vẫn được mở Vì vậy, nó luôn luôn được đặt vào cuối chương trình

1.2 Lập trình các phép biến đổi cơ bản của ảnh

1.2.1 Các phép xuất nhập ảnh và video

a Đọc - hiển thị ảnh và ghi ảnh trong OpenCV

• Hàm sử dụng

retval=cv.imread(filename[, flags])

retval, mats=cv.imreadmulti(filename[, mats[, flags]])

• Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

Trang 7

Thay các hàm cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV,

cv2.THRESH_OTSU và kết hợp 2 hàm với nhau

Trang 8

− Cách thứ nhất

plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')

plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis

plt.show()

− Cách thứ hai

plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL')

plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')

plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')

plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')

plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')

plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')

Trang 9

M = cv2.getPerspectiveTransform(pts1, pts2)

dst = cv2.warpPerspective(img, M, (300, 300))

M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.6)

res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

→ Nhận xét kết quả khi thêm và thay các lệnh và các hàm trên

c Mở - lưu từ camera và phát video

• Hàm sử dụng

− Mở camera

cap = cv.VideoCapture(0)

− Phát video

cap = cv.VideoCapture( 'vtest.avi' )

− Lưu video từ camera

fourcc = cv.VideoWriter_fourcc(* 'XVID' )

out = cv.VideoWriter( 'output.avi' ,fourcc, 20.0, (640,480))

ret, frame = cap.read()

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

frame_height= int (480/frame_width*frame_height)

ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT, frame_height)

ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480)

Trang 10

− Sinh viên tìm hiểu để thay đổi chương trình sao cho camera hiển thị ảnh màu với kích thước khung ảnh giá trị khác (320x240)

→ Nhận xét kết quả khi thêm và thay các lệnh và các hàm trên

• Lưu video từ camera

− Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

+ Thay đổi code sao cho ảnh quay thuận và ngược trên màn hình

+ Tìm hiểu cách thay đổi để lưu video dưới phần mở rộng khác *.avi

+ Tìm hiểu các lệnh mới áp dụng vào code trên

frame = cv2.resize(frame, (width, height))

→ Nhận xét kết quả khi thêm và thay các lệnh và các hàm trên

Trang 11

ret, frame = cap.read()

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)

FRAME_NOW = cap.get(cv2.CAP_PROP_POS_FRAMES)

→ Nhận xét kết quả khi thêm và thay các lệnh và các hàm trên

1.2.2 Các phép biến đổi và vẽ hình cơ bản

a Vẽ hình cơ bản

• Hàm sử dụng

cv.CreateTrackbar(trackbarName, windowName, value, count, onChange) → None

retval=cv.getTrackbarPos(trackbarname, winname) → retval

img = np.zeros((512,512,3), np.uint8)

img=cv.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

img=cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

img=cv.circle(img, center, radius, color[, thickness[, lineType[, shift]]])

img=cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]]) img=cv.ellipse(img, box, color[, thickness[, lineType]])

img=cv.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])

img=cv.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

Trang 13

− Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

radius = np.random.randint(5, high=200)

color = np.random.randint(0, high=256, size=(3,)).tolist()

pt = np.random.randint(0, high=300, size=(2,))

cv2.circle(canvas, tuple (pt), radius, color, -1)

b Các phép biến đổi cơ bản

dst=cv.AddWeighted(src1, alpha, src2, beta, gamma, dst)

hist=cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

plt.hist(img.ravel(),256,[0,256]); plt.show()

dst=cv.equalizeHist(src[, dst])

• Tách và kết hợp màu: (Splitting and Merging Image Channels)

− Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

Trang 14

cv.destroyAllWindows()

• Biến đổi không gian màu

− Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

from pprint import pprint

flags = [ i for in dir(cv2) if startswith('COLOR_')]

Trang 16

− Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

Trang 17

1.2.3 Các phép toán đại số trên ảnh

a Hàm sử dụng

dst=cv.add( src1, src2[, dst[, mask[, dtype]]])

dst=cv.subtract(src1, src2[, dst[, mask[, dtype]]])

dst=cv.multiply(src1, src2[, dst[, scale[, dtype]]])

dst=cv.divide(src1, src2[, dst[, scale[, dtype]]])

− Thực hiện phép toán dùng các hàm như gợi ý

cv2.subtract, cv2.add, cv2.multiply, cv2.divide, cv2.pow, cv2.sqrt

− Thay đổi hàm ngưỡng để tìm kết quả tốt nhất cho từng trường hợp ảnh xám và ảnh màu

1.2.4 Các phép toán logic trên ảnh

Trang 18

− Thực hiện các phép toán logic như gợi ý

cv2.bitwise_or, cv2.bitwise_xor, cv2.bitwise_not

− Thay đổi hàm ngưỡng để tìm kết quả tốt nhất cho từng trường hợp

− Thực hiện lại kết quả trên với ảnh màu

1.3 Lập trình các phép toán tiền xử lý ảnh

1.3.1 Lọc ảnh là gì

Lọc ảnh là một kĩ thuật chỉnh sửa hoặc làm rõ ảnh Việc loại bỏ những điểm lốm đốm trên một bức ảnh cũ, hay làm nét một bức ảnh bị nhòe, đấy là một số ví dụ về ứng dụng của việc lọc ảnh Làm mịn hay mờ ảnh, làm nét ảnh hay làm sắc nét cạnh của ảnh là một số phép

xử lý ảnh phổ biến của Lọc ảnh

1.3.2 Nguyên lý hoạt động của lọc ảnh

Lọc là phép toán thực hiện biến đổi một điểm ảnh dựa trên thông tin của các điểm ảnh xung quanh điểm ảnh đó Nói một cách đơn giản, khi chúng ta đưa một điểm ảnh vào, Lọc sẽ lấy thông tin của điểm ảnh lân cận tức những con số về cường độ sáng, áp dụng công thức toán

để tính ra giá trị đầu ra của điểm ảnh đấy

Thông thường, trong xử lý ảnh, các công thức dùng để biến để giá trị thường ở dạng tuyến tính Công thức tuyến tính là công thức có dạng a1x1 + a2x2 + + anxn=0) Và để thực hiện việc tính toán một cách nhanh chóng, công thức biến đổi sẽ được biểu diễn thành một ma trận nhân/lõi (kernel/mask/convolution matrix), và việc biến đổi ảnh sẽ được thực hiện bằng cách tính tích chập giữa ma trận nhân

Hình 1.1: Lọc ảnh

Trang 19

1.3.3 Lọc chập (Convolution)

Trong toán học, Convolution (tích chập) là một phép toán với đầu vào là 2 hàm số (hàm

f và g), với kết quả đầu ra là một hàm mới được tạo từ 2 hàm f và g Đối với bài toán xử lý ảnh,

ta có thể coi:

Hàm f: ảnh đầu vào

Hàm g: ma trận nhân kernel

Kết quả Convolution (f*g): ảnh sau khi biến đổi

Công thức tính Convolution (1D) được định nghĩa như sau:

Đối với bài toán xử lý ảnh, chúng ta sẽ áp dụng công thức tính Convolution 2D (sau khi

đã lấy mẫu đưa về dạng rời rạc):

Áp dụng công thức trên vào, ta có kết quả như hình dưới

Như hình trên, mục tiêu của phép convolution này là tính giá trị mới của e (tọa độ [2,2]) sau khi biến đổi Theo công thức tính Convolution 2D, ta có:

f∗g([2,2])=f([2,2])∗g([2,2])f∗g([2,2])=f([2,2])∗g([2,2])

(Chú ý: Phép * ở đây là phép Convolution, không phải phép nhân thông thường)

=f[1,1].g[4−1,4−1]+f[1,2].g[4−1,4−2]+f[1,3].g[4−1,4−2]+=f[1,1].g[4−1,4−1]+f[1,2].g[4

−1,4−2]+f[1,3].g[4−1,4−2]+f[2,1].g[4−2,4−1]+ +f[3,3].g[4−3,4−3]f[2,1].g[4−2,4−1]+ +f[3,3].g[4−3,4−3] =a.9+b.8+c.7+d.6+ +i.1=a.9+b.8+c.7+d.6+ +i.1

1.3.4 Làm mờ ảnh (Blur)

Trước khi nói về cách làm mờ ảnh, chúng ta sẽ nói về vấn đề tại sao phải làm mờ ảnh

Hình 1.2 Ví dụ ảnh nhiễu

Trang 20

Hình bên trên là một ví dụ minh họa cho ảnh bị nhiễu Một cách trực quan, chúng ta có thể định nghĩa điểm nhiễu là những điểm đốm trắng đen khiến cho hình khó nhìn Nếu để ý kĩ hơn, chúng ta có thể thấy, các điểm nhiễu này có mức sáng chênh lệch rõ ràng so với những điểm xung quanh điểm trắng nổi lên giữa khu vực màu đen Để loại bỏ những điểm nhiễu này, hay loại bỏ những điểm có mức sáng chênh lệch lớn bất thường, làm mờ ảnh là một trong những phương pháp phổ biến nhất được áp dụng

Cách để làm mờ những điểm có độ sáng bất thường trên ảnh Biện pháp đơn giản nhất chính là thay thế những điểm có độ sáng bất thường bằng trung bình độ sáng của những điểm lân cận

Với ý tưởng trên, chúng ta sẽ tính tích chập ảnh với ma trận nhân (kernel) Khi nhân tích chập với ma trận này, giá trị đầu ra của điểm được tính sẽ bằng trung bình cộng của 8 điểm xung quanh và giá trị của chính điểm đó

kernel = np.ones((3,3), np.float32)/9

blur_img = cv2.filter2D(img, -1, kernel)

f, axs = plt.subplots(1,2, figsize=(10,5))

axs[0].imshow(img)

axs[1].imshow(blur_img)

plt.show()

b Giải thích

Đầu tiên, chương trình sẽ load hình ảnh vào bằng câu lệnh cv2.imread

Câu lệnh kernel = np.ones((3,3), np.float32)/9 tạo ra một ma trận vuông 3x3 với tất cả các phần tử có giá trị là 1/9

Hàm cv2.filter2D thực hiện việc nhân convolution giữa ảnh img và ma trận nhân kernel để cho ra kết quả là ảnh đã làm mờ blur_img Tham số -1 trong hàm cv2.filter2D để chỉ ảnh đầu ra

có cùng độ sâu màu ddepth với ảnh gốc

Trang 21

• Bài tập mở rộng: thực hiện bài tập có các hàm sử dụng như gợi ý

dst=cv.blur(src, ksize[, dst[, anchor[, borderType]]])

dst=cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])

dst=cv.medianBlur(src, ksize[, dst])

dst=cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])

b Biến đổi Fourier

• Các hàm sử dụng

− Biế n đổi Fourier trong Numpy

+ FFT

f_ishift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f_ishift)

+ DFT

f_ishift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f_ishift)

− Fourier Transform in OpenCV

Trang 22

plt.subplot(121), plt.imshow(img, cmap='gray')

plt.title('Input Image'), plt.xticks([]), plt.yticks([])

plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray') plt.title('Magnitude Spectrum FFT'), plt.xticks([]), plt.yticks([]) plt.show()

• Bài tập mở rộng: biến đổi DFT

+ Sử dụng các hàm tương ứng trong OpenCV là cv2.dft () và cv2.idft () + Sử dụng hàm cv2.cartToPolar () để trả về biên độ và pha

1.3.6 Các phép nổi biên

a Hàm sử dụng

dst=cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

dst=cv.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])

dst=cv.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])

edges=cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) edges=cv.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]])

b Lọc Laplace và Sobel làm nổi biên

+ Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

Trang 23

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray') plt.title('Original'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray') plt.title('Laplacian'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray') plt.title('Sobel X'), plt.xticks([]), plt.yticks([]) plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray') plt.title('Sobel Y'), plt.xticks([]), plt.yticks([]) plt.show()

+ Bài tập mở rộng

+ Lọc sobel cho ảnh có kiểu dữ liệu là 8U và 64F

+ Làm nổi biên dùng lọc canny, sử dụng hàm: cv.Canny()

c Biến đổi ảnh Pyramids

− Hàm sử dụng

dst=cv.pyrUp(src[, dst[, dstsize[, borderType]]])

dst=cv.pyrDown(src[, dst[, dstsize[, borderType]]])

Trang 24

+ Thay đổi để sử dụng hàm cv2.pyrUp và cv2.pyrDown như gợi ý

src = cv2.pyrUp(src, dstsize=(2 *cols, 2*rows))

rc = cv2.pyrDown(src, dstsize=(cols//2, rows//2))

1.3.7 Các phép biến đổi hình thái học

• Hàm sử dụng

dst=cv.dilate(scr, kernel[, dst[, anchor[, interations[, borderType[, borderValue]]]]])

dst=cv.erode(scr, kernel[, dst[, anchor[, interations[, borderType[, borderValue]]]]])

dst=cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)

• Kéo giãn ảnh (dilate)

+ Code mẫu: Sinh viên chạy các code này và tìm hiểu từng câu lệnh

kernel = np.ones((5, 5), np.uint8)

dilation = cv2.dilate(img, kernel, iterations=1)

Thay đổi lệnh cv2.dilate() thành các lệnh

erosion = cv2.erode(img, kernel, iterations=1)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

Trang 25

→ Nhận xét kết quả khi thêm và thay các lệnh và các hàm trên

1.4 Bài tập áp dụng

a Bài hiển thị ảnh bằng lệnh imshow

Viết đoạn code hiển thị các ảnh của sinh viên trong nhóm, ứng dụng các lệnh đã học ở trên (cv2.IMREAD_GRAYSCALE, cv2.IMREAD_COLOR, cv2.IMREAD_UNCHANGED)

để hiển thị ảnh xám, màu, anpha và in ra (phiên bản của opencv dang sử dụng và tỉ lệ row/col; colum/with; aisle)

c Viết các chương trình hiển thị camera

− Viết chương trình mở camera và hiển thị kết hình ảnh camera theo hàm plt

− Viết chương trình mở camera và hiển thị kết hình ảnh camera theo hàm imshow, và

in ra kết quả frame.shape ra màn hình python

− Viết chương trình kiểm tra 2 camera có đang kết nối vào máy tính, nếu có camera nào được kết nối thì kích hoạt nó sáng đèn lên một lần

− Viết chương trình phát video bằng cách đọc frame, kết quả hiển thị video theo frame

và in kết quả ra màn hình python theo FRAME_NOW

Trang 26

− Viết các chương trình thưc hiện cộng việc tạo ảnh màu theo các màu: đen, trắng, đỏ, xanh lá, xanh lam, ½ đỏ-½ trắng, ½ đen-½ xanh lá , ½ trắng -½ xanh lam

− Viết các chương trình thưc hiện vẽ các hình lên ảnh theo yêu cầu

+ Vẽ lên ảnh từ lệnh imread và vẽ lên ảnh này các hình tròn, hình vuông, đường thẳng và viết lên ảnh đó chữ OpenCV theo tọa độ tự chọn

+ Vẽ tự động các vòng tròn có màu sắc và đường kính thay đổi ngẫu nhiên bằng cách click chuột

+ Vẽ để tạo hình logo OpenCV có nền đen, chữ OpenCV màu trắng và 3 bán nguyệt

có màu R, G, B (xem mẫu logo từ bài học)

+ Viết chương trình tổng hơp dùng các hàm Line, Circle, Rectangle, Ellipse, Polygon, Text đễ vẽ lên ảnh và tọa độ tự chọn

e Viết chương trình dùng kỹ thuật biến đổi ảnh như sau

− Gọi lại chuột trái và phải khi click chuột trái hay phải lên cửa sổ và in ra tọ độ của chuột (r, c) ra màn hình python, gợi ý sử dụng hàm cv2.setMouseCallback("original", click_event)

− Viết chương trình vẽ khung hình (ROI) trên một ảnh, gợi ý khung hình ROI

ball=img[280:340,330:390]

img[93:153,200:260]=ball

− Viết chương trình vẽ đường bao cho các khung hình với kết quả sử dụng hàm hiển thị là

plt các ảnh hiển thị gồm ảnh ORIGNAL, REPLICATE, REFLECT, REFLEC_T101, WRAP, CONSTANT gợi ý sử dụng hàm

cv2.copyMakeBorder(img1,top=10,bottom=10,left=10,right=10,borderType=cv2.BORDER_REPLICAT E)

− Viết chương trình vẽ histogram theo ngưỡng các hàm gợi ý

ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

Trang 27

roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256])

dst = cv2.warpAffine(img, M, (2 * cols, 2 * rows))

− Viết chương trình thực hiện công việc thay đổi kích thước ảnh sử dụng hàm như gợi ý

res = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)

− Viết chương trình thực hiện scale ảnh, warpAffine ảnh, và rotate ảnh bất kỳ

− Viết chương trình sử dụng hàm Warp có nền và không có nền như phần gợi ý

M = cv2.getPerspectiveTransform(src_pts, dst_pts)

warp = cv2.warpPerspective(img22, M, ( int (width), int (height)))

f Viết chương trình ứng dụng các phép toán đại số

Viết chương trình thực hiện công việc như các hình như gợi ý

+ Trừ ảnh có ngưỡng có sử dụng hàm xấp xỉ và tìm đường bao

approx = cv2.approxPolyDP(cnt, epsilon, True)

Thay đổi các phép toán add, multiply, pow để nhận xét kết quả

g Viết các chương trình thực hiện tạo các phép toán logic gợi ý

+ Sử dụng tổng hợp các thuật toán bitwise có ngưỡng và tìm ra phương án tốt nhất

cv2.THRESH_OTSU); cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC; cv2.THRESH_TOZERO; cv2.THRESH_TOZERO_INV

cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.ADAPTIVE_THRESH_MEAN_C

Trang 28

+ AND 2 ảnh dùng hàm cv2.bitwise_and()

+ AND 2 ảnh nhưng dùng hàm cv2.addWeighted()

+ XOR ảnh theo thời gian thực (trừ trực tiếp từ camera)

− Viết các chương trình thực hiện các hàm biến đổi sau

+ Lọc Laplace: sử dụng theo gợi ý

imgLaplacian = cv2.filter2D(sharp, cv2.CV_32F, kernel)

− Viết các chương trình thực hiện các hàm biến đổi sau

+ Biến đổi FFT theo gợi ý

Chúng ta sử dụng cửa sổ hình chữ nhật 60x60 để che hình ảnh có trọng số thấp Sau đó, sử dụng hàm np.fft.ifftshift () và hàm biến đổi FFT np.ifft2 ()

Sử dụng tiếp hàm lấy trị tuyệt đối np.abs()

+ Biến đổi DFT theo gợi ý

Trang 29

Trong phần DFT chúng ta đã sử dụng bộ lọc thông cao HPF Bây giờ, ta phải thực hiện lọc thông thấp LPF để loại bỏ các điểm tần số cao Trong thực tế đó chính là để làm mờ hình ảnh

Đầu tiên chúng ta xây dựng một mặt nạ tương ứng với vùng tần số thấp và đặt nó thành

1, các vùng còn lại được đặt thành 0 Sau đâu là mặt nạ được áp dụng để biến đổi DFT ngược

fshift = dft_shift * mask

f_ishift = np.fft.ifftshift(fshift)

img_back = cv2.idft(f_ishift)

img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

− Viết chương trình thực hiện lọc ảnh Pyramids theo gợi ý

gaussian_pyramid và laplacian_pyramid

i Các bài tổng hợp nâng cao

− Viết chương trình trộn 2 ảnh ví dụ như đặt ảnh của chiếc xe ô tô trên đường lộ trống

− Viết chương trình hiển thị ảnh trên camera và tạo 2 Trackbar và một hiển thị Frame có tên là mức xám (50-500) lên trên màn hình và camera một chọn hiện ảnh màu hay ảnh xám

− Viết chương trình hiển thị ảnh lên camera và tạo 6 Trackbar thay đổi cho không gian màu HSV (3 thanh cho mức thấp, 3 thanh cho mức cao) để chọn mặt nạ nhằm loại bỏ nền và cho ảnh ra theo màu đã chọn để loại nền

− Viết chương trình hiển thị ảnh theo ngưỡng mà giá trị ngưỡng được chọn bằng thanh Trackbar (giá trị chọn từ 128-255), kết quả hiển thị các ảnh ra nhị phân theo 5 ngưỡng đã học

− Viết chương trình biến đổi theo phối cảnh trên camera, yêu cầu hiển thị ảnh từ camera sau đó bấm chọn 4 điểm trên màn hình sẽ xuất hiện ảnh chỉ nằm trong khung 4 điểm mà

Trang 30

− Viết chương trình tìm biên ảnh từ camear sử dụng các hàm Sobelx, Sobely, Laplacian, Canny

− Viết chương trình tìm đường đồng mức theo màu trong không gian màu HSV theo thời gian thực

− Viết chương trình chèn 1 ảnh opencv_logo và viết chữ lên ảnh Lenna như kết quả gợi ý

Trang 31

TRÍCH RÚT ĐẶC TRƯNG 2.1 Phân đoạn theo biên ảnh

2.1.1 Giới thiệu phân đoạn ảnh

Phân đoạn hay còn gọi là phân vùng ảnh là một thao tác ở mức thấp trong toàn bộ quá trình xử lý ảnh Quá trình này thực hiện việc phân vùng ảnh thành các vùng rời rạc và đồng nhất với nhau hay nói cách khác là xác định các biên của các vùng ảnh đó

Trong lĩnh vực thị giác máy tính, phân vùng ảnh là một quá trình chia một bức ảnh số thành nhiều phần khác nhau (tập hợp các điểm ảnh, hay có thể gọi là superpixels) Mục tiêu của phân vùng ảnh là để đơn giản hóa và hoặc thay đổi biểu diễn của một tấm ảnh vào điều gì đó

có ý nghĩa hơn và dễ dàng để phân tích Phân vùng ảnh thường được sử dụng để xác định vị trí các đối tượng, đường biên như đường thẳng, cong… Hay nói cách khác phân vùng ảnh là một quá trình gán nhãn cho mỗi điểm ảnh trong một bức ảnh, các điểm ảnh trong cùng một nhãn sẽ

có những đặc tính giống nhau về màu sắc, cường độ hoặc kết cấu của ảnh

Kết quả của việc phân vùng ảnh là tập hợp các phân đoạn có thể là toàn bộ bức ảnh hoặc tập hợp các đường biên tách ra xuất từ hình ảnh Các điểm ảnh trong cùng một vùng có đặc tính tương tự nhau về màu sắc, cường độ hoặc kết cấu Các vùng lân cận thì khác nhau đáng kể về các đặc trưng trên

Phân vùng ảnh là một bước quan trọng trong nhiều lĩnh vực khác nhau như lĩnh vực hình ảnh y tế, phát hiện và nhận dạng đối tượng, hệ thống camera giám sát, hệ thống điều khiển giao thông… Kỹ thuật này là bước tiền xử lý quan trọng trong hầu hết các hệ thống xử lý ảnh, kết quả phân vùng tốt sẽ giúp cho quá trình xử lý về sau đạt hiệu quả cao hơn nhằm tiết kiệm về chi phí tính toán, thời gian cũng như tăng độ chính xác của các ứng dụng trên

2.1.2 Một vài ứng dụng cụ thể trong phân vùng ảnh

Trang 32

− Một số nhiệm vụ nhận dạng

+ Nhận dạng khuôn mặt

+ Nhận dạng vân tay

+ Nhận dạng mắt

− Hệ thống giám sát giao thông

− Camera giám sát an ninh

Trong lĩnh vực nhận dạng đối tượng, quá trình phân vùng ảnh sẽ tách đối tượng ra khỏi vùng nền Đối tượng ở đây có thể là con người hoặc một vật gì đó chuyển động thuộc vùng tiền cảnh Đối tượng sau khi được tách ra trong quá trình phân vùng có thể được xử lý trong các hệ thống như đếm số lượng người ra vào, nhận dạng cử chỉ tay, nhận dạng khuôn mặt

Trong lĩnh vực camera giám sát, quá trình phân vùng ảnh có thể ứng dụng trong việc xác định, giám sát đối tượng đi vào vùng giám sát, cảnh báo chuyển động khi đối tượng di chuyển vào vùng giám sát

Trong lĩnh vực hình ảnh y tế, các kỹ thuật hình ảnh y tế như chụp CT , chụp MRI, chụp Quang, không thể thiếu để có thể phân tích chính xác nhiều bệnh lý khác nhau, qua đó nó đã hộ trợ đáng kể bác sĩ trong việc chẩn đoán bệnh Trong quá trình phân tích, người chẩn đoán cần phân trích xuất các đường biên cần thiết, các bề mặt hoặc các bộ phận cơ thể ra khỏi bức hình,

X-kỹ thuật này được gọi là phân vùng

Tuy nhiên, quá trình phân vùng thủ công là rất tốn thời gian và có thể không cho kết quả tốt Các phân vùng và đường biên này là rất quan trọng đối với các bác sĩ Chính vì vậy, trong vài thập kỷ qua, nhiều thuật toán phân vùng ảnh y tế được đề xuất nhằm tăng độ chính xác trong quá trình phân vùng ảnh

2.1.3 Thuật toán phân vùng ảnh sử dụng hàm tìm đường đồng mức (Contours)

Trang 33

approxCurve=cv.approxPolyDP(curve, epsilon, closed[, approxCurve])

− Đặc tính lồi của đường đồng mức

hull=cv.convexHull(points[, hull[, clockwise[, returnPoints]]])

− Kiểm tra độ lồi

retval=cv.fitLine(points, distType, param, reps, aeps[, line])

c Thuộc tính của đường đồng mức

Trang 34

− Giá trị cực đại, cực tiểu và vị trí

min_val, max_val, min_loc, max_loc = cv.minMaxLoc(imgray,mask = mask)

− Giá trị trung bình của màu hoặc cường độ sáng

mean_val = cv.mean(im,mask = mask)

− Các dấu vết điểm lồi

convexityDefects=cv.convexityDefects(contour, convexhull[, convexityDefects])

− Kiểm tra điểm gấp khúc

Trang 35

ret, thresh = cv2.threshold(src=imgray, thresh=80, maxval=255,

type=cv2.THRESH_BINARY)

cv2.imshow("thresh", thresh)

image, contours, hierarchy =

cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

print("contours size: ", len(contours))

img = cv2.drawContours(im, contours, 1, (0,255,0), 3)

cv2.namedWindow("contour.jpg", 0)

cv2.imshow("contour.jpg", img)

cv2.waitKey(0)

2.1.4 Bài tập mở rộng

− Viết chương trình thay đổi theo yêu cầu sau

− Thay đổi với ba hàm ngưỡng khác nhau

cv2.threshold(imgray, 0, 25, 0)

cv2.threshold(imgray, 0, 100, 0)

cv2.threshold(src=imgray,thresh=127,maxval=255,type=cv2.THRESH_BINARY)

− Sử dụng hàm tìm đường biên

cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

− Thay đổi hàm vẽ đường biên theo 2 dạng sau

cv2.drawContours(im, contours, -1, (0,255,0), 3)

cv2.drawContours(im, contours, 3, (255, 0, 0), 3)

− Tìm đường biên của ảnh và in ra chiều dài của đường biên (ảnh vào là

contour.jpg, contour1.jpg)

2.2 Phân đoạn ảnh theo ngưỡng

2.2.1 Phân vùng theo ngưỡng biên độ

a Dựa vào đặc tính vật lý của ảnh, có nhiều kỹ thuật phân vùng:

Trang 36

− Phân vùng dựa theo miền liên thông gọi là phân vùng dựa theo miền đồng nhất hay miền kề;

− Phân vùng dựa vào biên gọi là phân vùng biên

− Ngoài ra còn có các kỹ thuật phân vùng khác dựa vào biên độ, phân vùng dựa theo kết cấu…

Các đặc tính đơn giản, cần thiết nhất của ảnh là biên độ và các tính chất vật lý như : độ tương phản, độ truyền sáng, màu sắc

Có thể dùng ngưỡng biên độ để phân vùng khi biên độ đủ lớn đặc trưng cho ảnh, như biên

độ trong bộ cảm biến ảnh hồng ngoại có thể phản ánh vùng có nhiệt độ thấp hay vùng có nhiệt

độ cao

b Việc chọn ngưỡng rất quan trọng, gồm các bước:

− Xem xét lược đồ xám của ảnh để xác định các đỉnh và các khe Nếu ảnh có dạng rắn lượn (nhiều đỉnh và khe), các khe có thể dùng để chọn ngưỡng

− Chọn ngưỡng t sao cho một phần xác định trước ηcủa toàn bộ số mẫu là thấp hơn t

− Điều chỉnh ngưỡng dựa trên lược đồ xám của các điểm lân cận

− Chọn ngưỡng theo lược đồ xám của những điểm thỏa mãn tiêu chuẩn chọn

− Khi có mô hình phân lớp xác suất, việc xác định ngưỡng dựa vào tiêu chuẩn xác suất nhằm cực tiểu xác suất sai số hoặc dựa vào một số tính chất khác của luật Bayes

c Ví dụ:

Hình 2.1: Ngưỡng biên độ

− Giả sử 1 ảnh có lược đồ xám như hình trên, chọn các ngưỡng với:

T0 =Lmin,…,T4 =Lmax Ta có 5 ngưỡng phân tích ảnh

− Gọi C là vùng thứ k của ảnh, cách phân vùng theo nguyên tắc :

P(m,n) ∈ Ck nếu Tk-1 ≤ P(m,n) < Tk , k=1,2,3,4

Trang 37

− Khi phân vùng xong, nếu ảnh rõ nét thì việc phân vùng coi như kết thúc Nếu không, cần điều chỉnh ngưỡng

2.2.2 Phân vùng ảnh bằng cách khoanh vùng với đường bao nhỏ nhất

Áp dụng nội dung giới hạn của đường đồng mức ở mục 2.1.3c để thực hiện cho các nội dung này

Code mẫu: Sinh viên chạy code này và tìm hiểu từng câu lệnh để tìm hiểu thuật toán, chú

ý hàm cv2.minAreaRect()

import cv2

import numpy as np

img = cv2.imread('MyPictures/lightning.png')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

image, contours, hierarchy = cv2.findContours(imgray, cv2.RETR_TREE,

cv2.CHAIN_APPROX_SIMPLE)

contours = [ cnt for cnt in contours if cv2.contourArea( cnt ) > 100]

print('len(contours)', len(contours))

cnt = contours[0]

(x, y), (MA, ma), angle = cv2.fitEllipse(cnt)

print((x, y), (MA, ma), angle)

Trang 38

2.3 Phân đoạn ảnh theo màu đồng nhất

2.3.1 Giới thiệu

Kỹ thuật phân vùng ảnh thành các miền đồng nhất dựa vào các tính chất quan trọng nào

đó của miền trên ảnh

Việc lựa chọn các tính chất của miền sẽ xác định tiêu chuẩn phân vùng Tính đồng nhất của một miền ảnh là điểm chủ yếu xác định tính hiệu quả của việc phân vùng

Các tiêu chuẩn hay được dùng là sự thuần nhất về mức xám, màu sắc đối với ảnh màu Các phương pháp phân vùng ảnh theo miền đồng nhất thường áp dụng là:

− Phương pháp tách cây tứ phân

− Phương pháp cục bộ

− Phương pháp tổng hợp

2.3.2 Phân đoạn dùng thuật toán watershed

Code mẫu: Sinh viên chạy code này và tìm hiểu từng câu lệnh để tìm hiểu thuật toán chú

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV +

cv2.THRESH_OTSU)

cv2.imshow('thresh', thresh)

kernel = np.ones((3, 3), np.uint8)

opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) sure_bg = cv2.dilate(opening, kernel, iterations=3)

dist_transform = cv2.distanceTransform(opening, 1, 5)

ret, sure_fg = cv2.threshold(dist_transform, 0.1 * dist_transform.max(),

255, 0)

Trang 39

− Ý tưởng ở đây là tìm đối tượng tên ảnh và xóa nền

− Thuật toán GrabCut sẽ trích xuất ảnh nền trong hình ảnh

− Ứng dụng của thuật toán GrabCut trong việc tách nền các hình ảnh

Trang 40

tượng, chúng ta đánh dấu chúng, và sửa nó trong lần lặp tiếp theo", hoặc ngược lại thì cho cho nền

Xem hình ảnh bên dưới Cầu thủ và quả bóng được bao bọc trong một hình chữ nhật màu xanh Sau đó, một số nét trắng (biểu thị foreground) và nét đen (biểu thị nền) Kết quả sau khi thực hiện thuật toán

Hình 2.2: Ảnh của thuật toán GrabCut Foreground

− Khi đó mô hình Gaussian (GMM) được sử dụng để mô hình hóa nền trước và nền sau Tùy thuộc vào dữ liệu chúng ta đã cung cấp, GMM học và cung cấp các pixel mới Tức là, các điểm ảnh không xác định được gắn nhãn hoặc nền trước có thể hoặc không thể xảy ra tùy thuộc vào lân cận của chúng với các pixel được gắn nhãn cứng khác theo số liệu thống kê màu (Nó giống như phân cụm)

− Biểu đồ được tạo từ phân bố của các pixel này Nếu các nút trong biểu đồ là pixel sẽ

có hai nút được thêm vào, nút Nỗi và nút Chìm Mỗi điểm ảnh nền trước được kết nối với nút Nỗi và mỗi điểm ảnh nền sau được kết nối với nút Chìm

− Trọng số các cạnh nối các điểm ảnh với nút Nỗi so với nút kết thúc được xác định bởi xác suất của pixel là nền trước so với nền sau

− Trọng số giữa các pixel được xác định bởi thông tin cạnh hoặc điểm tương đồng pixel Nếu có sự khác biệt lớn về màu pixel, cạnh giữa chúng sẽ có trọng số thấp

− Sau đó, thuật toán cắt nhỏ để sử dụng phân đoạn theo biểu đồ Nó cắt biểu đồ thành

hai nút nỗi và nút chìm bới hàm đánh giá

Ngày đăng: 31/12/2021, 09:11

HÌNH ẢNH LIÊN QUAN

Hình 1.2 Ví dụ ảnh nhiễu - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 1.2 Ví dụ ảnh nhiễu (Trang 19)
Hình 2.2: Ảnh của thuật toán GrabCut Foreground - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.2 Ảnh của thuật toán GrabCut Foreground (Trang 40)
Hình 2.3: Thuật toán GrabCut Foreground - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.3 Thuật toán GrabCut Foreground (Trang 41)
Hình 2.4: Ảnh ví dụ cho thuật toán Shi-Tomasi - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.4 Ảnh ví dụ cho thuật toán Shi-Tomasi (Trang 42)
Hình 2.5: Ví dụ cơ bản về SIFT - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.5 Ví dụ cơ bản về SIFT (Trang 46)
Hình 2.6: Quá trình tính không gian đo (L) và hàm sai khác D - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.6 Quá trình tính không gian đo (L) và hàm sai khác D (Trang 48)
Hình 2.7 Quá trình tìm điểm cực trị trong các hàm sai phân DoG - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.7 Quá trình tìm điểm cực trị trong các hàm sai phân DoG (Trang 49)
Hình 2.8: Loại bỏ những điểm tương phản kém - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.8 Loại bỏ những điểm tương phản kém (Trang 50)
Hình 2.10: Kết quả sau khi thực hiện bước 4. - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.10 Kết quả sau khi thực hiện bước 4 (Trang 52)
Hình 2.9: Mô tả tạo bộ mô tả cục bộ - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 2.9 Mô tả tạo bộ mô tả cục bộ (Trang 52)
Hình 3.1: Ảnh Blob - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 3.1 Ảnh Blob (Trang 57)
Hình 3.2: Xác định hoạt động của ảnh Blob - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 3.2 Xác định hoạt động của ảnh Blob (Trang 57)
Hình 3.2: Ảnh Comvexity - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 3.2 Ảnh Comvexity (Trang 58)
Hình 3.3: Ảnh Inertia ratio - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 3.3 Ảnh Inertia ratio (Trang 59)
Hình 3.4: Biến đổi Houghline - TÀI LIỆU XỬ LÝ ẢNH (OPENCVPYTHON) ĐẦY ĐỦ NHẤT
Hình 3.4 Biến đổi Houghline (Trang 61)

TỪ KHÓA LIÊN QUAN

w