Professional Documents
Culture Documents
Code:
import cv2
import math
import numpy as np
angle = 26
img = cv2.imread('image/12.JPG')
cv2.imwrite("Original.jpg", img)
k2 = rotateUpdate(img, angle)
cv2.imwrite("Rotated.jpg", k2)
Bài 2: Tạo ảnh GIF
Kết quả:
Code:
import imageio.v2 as imageio
import os
files = os.listdir('images')
image_path = [os.path.join('images',file) for file in files]
images = []
for img in image_path:
images.append(imageio.imread(img))
imageio.mimwrite('myfirsthwgif.gif', images, duration = 500)
BUỔI 2:
Bài 1: Chia 1 ảnh thành 16 ô rồi xếp random thành 1 ảnh
Kết quả:
Code:
import cv2
import math
import numpy as np
import random
def permImg():
arr = [*range(16)]
random.shuffle(arr)
image = cv2.imread('kodak\kodim07.png')
height = image.shape[0]
width = image.shape[1]
w16 = width // 4
h16 = height // 4
cnt = 0
img = np.zeros([16, h16, w16, 3], dtype=np.uint8)
for k in range(4):
for h in range(4):
for x in range(h16):
for y in range(w16):
img[cnt][x][y] = image[h16*k + x][w16 * h+y]
cnt += 1
permImg()
BUỔI 3:
Câu 1: Viết Chương trình tìm & hiển thị Histogram 1 hình bất kỳ (xám & màu)
Kết quả:
Code:
import cv2
import math
import numpy as np
import random
from matplotlib import pyplot as plt
image = cv2.imread('image/4.JPG')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.waitKey(0)
cv2.destroyWindow()
Câu 2: Cân bằng histogram
Kết quả
Nhận xét :
- Khi sử dụng hàm có sẵn, histogram được trải dài với mật độ tốt hơn so với hàm
được viết
- Tuy nhiên, khi zoom lên, biểu đồ này lên xuống liên tục và không mượt bằng thuật
được viết
Code:
clc
clear all
close all
warning off
x= imread('http://nghiencuuquocte.org/wp-content/uploads/2018/03/14.jpg');
subplot(3,2,1);
imshow(x);
title('Original Image');
subplot(3,2,2);
imhist(x);
title('Histogram of Original Image using built in function');
axis tight;
h=zeros(1,256);
[r c]=size(x);
totla_no_of_pixels=r*c;
n=0:255;
j=histeq(x);
subplot(3,2,3);
imshow(j);
title('Histogram Equalization using built in function');
subplot(3,2,4);
imhist(j);
axis tight;
title('Histogram Equalization using built in function');
for i=1:r
for j=1:c
h(x(i,j)+1)=h(x(i,j)+1)+1;
end
end
for i=1:256
h(i)=h(i)/totla_no_of_pixels;
end
temp=h(1);
for i=2:256
temp=temp+h(i);
h(i)=temp;
end
for i=1:r
for j=1:c
x(i,j)=round(h(x(i,j)+1)*255);
end
end
subplot(3,2,5);
imshow(x);
title('Histogram Equalized image using own code');
subplot(3,2,6);
imhist(x);
axis tight;
title('Histogram Equalization using own code');
BUỔI 4:
H1 = ¼ . [1 ; 2 ; 1] ; H2 = H1’ (Chuyển vị); I : ảnh xám
a, Tính
Y1 = I * H1
Y2 = Y1 * H2
b, Gọi H = 1/16 [1 2 1;2 4 2;1 2 1]
Tính Y3 = I * H
c, So sánh Y2 & Y3. Nhận xét 2 thuộc tính Y2 & Y3
Kết quả:
Y1 Y2 Y3
Nhận xét:
- Ta thấy ảnh Y2 và Y3 là giống nhau vì bộ lọc H của Y3 chính là bộ lọc tách được
và tách thành 2 bộ lọc chính là H1 và H2
- Khi dùng lần lượt 2 bộ lọc H1 và H2 độ phức tạp sẽ là M.N.3.2, tốc độ sẽ nhanh
hơn khi dùng bộ lọc H với độ phức tạp là M.N.3.3
- Tổng quát khi hình ảnh có kích thước lớn, và bộ lọc tách được có kích thước lớn
thì thời gian chạy sẽ tối ưu hơn rất nhiều khi tách thành 2 bộ lọc con rồi đem đi
chập.
Code:
img = rgb2gray(imread('/MATLAB Drive/12.JPG'));
[h, w] = size(img);
H1 = [1 ;2 ;1] / 4;
H2 = transpose(H1);
% Cau A
Y1 = conv2(img, H1,'same');
Y2 = conv2(Y1, H2,'same');
subplot(2,2,1);
imshow(Y1,[]);
title('Y1');
subplot(2,2,2);
imshow(Y2,[]);
title('Y2');
% Cau B
H = [1 2 1; 2 4 2; 1 2 1] / 16;
Y3 = conv2(img, H, 'same');
size(Y3);
subplot(2,2,3);
imshow(Y3,[]);
title('Y3');
subplot(2,2,4);
imshow(img,[]);
title('Original');
max(abs(Y2-Y1));
max(abs(Y3-Y2));
Buổi 5: Dùng phương pháp nội suy song tuyến tính tìm giá trị ảnh từ ảnh mosaic
Kết quả:
Ảnh mosaic ban đầu Ảnh sau khi áp dụng thuật toán Alleysson
Nhận xét:
- Vấn đề sai màu được cải thiện hơn đôi chút
- Về vấn đề 'blurring', thuật toán Alleysson được cải thiện rõ rệt hơn so với thuật
toán nội suy song tuyến tính vì thuật toán này chỉ nội suy trên thành phần Chrominance,
trong khi Luminance được trích xuất từ hình ảnh mosaic 1 lớp đầu tiên.
Code:
% THUAT TOAN ALLEYSSON
img = imread('/MATLAB Drive/19.jpg');
[h, w, t] = size(img);
I = zeros(h,w);
I(1:2:h,1:2:w) = img(1:2:h,1:2:w,1);
I(1:2:h,2:2:w) = img(1:2:h,2:2:w,2);
I(2:2:h,1:2:w) = img(2:2:h,1:2:w,2);
I(2:2:h,2:2:w) = img(2:2:h,2:2:w,3);
FL = [-2 3 -6 3 -2;3 4 2 4 3;-6 2 48 2 -6;3 4 2 4 3;-2 3 -6 3 -2]/64;
lmn = conv2(I,FL,'same');
MC = I - lmn;
C = img;
mR = zeros(h,w);mG = zeros(h,w);mB = zeros(h,w);
mR(1:2:h,1:2:w) = 1;
mG(1:2:h,2:2:w) = 1;mG(2:2:h,1:2:w) = 1;
mB(2:2:h,2:2:w) = 1;
C1 = MC .* mR;
C2 = MC .* mG;
C3 = MC .* mB;
WRB = [1 2 1;2 4 2;1 2 1] / 4;
WG = [0 1 0; 1 4 1; 0 1 0] / 4;
res = img;
res(:,:,1) = conv2(C1,WRB,'same') + lmn;
res(:,:,2) = conv2(C2, WG,'same') + lmn;
res(:,:,3) = conv2(C3, WRB,'same') + lmn;
imwrite(res,'res.jpg')
BUỔI 7, 8: không có
BUỔI 9:
Chọn các hình: bãi biển, tòa nhà, nội thất, cây, người đi bộ
Trộn phổ biên độ của 5 hình trên, tìm cách tìm tương ứng
Kết quả:
Nhận xét cách tìm ảnh tương ứng với phổ nào:
- Những ảnh có nhiều góc cạnh thì khi chuyển sang biểu diễn ở miền tần số sẽ có
nhiều đường sáng chạy qua tâm, những đường đó thể hiện sự chuyển đổi mức
năng lượng (các góc cạnh) từ vùng này sang vùng khác trong ảnh.
Để dễ giải thích, ta đánh số tăng dần từ 1 đến 5 từ trái qua phải, từ trên xuống dưới
- Với ảnh bãi biến tương ứng với hình 4
- Với hình ảnh tòa nhà, phổ biên độ gồm nhiều đường gạch thẳng nên sẽ tương ứng
với hình 5
- Với hình ảnh nội thất tương ứng với hình 2
- Với hình ảnh người đi bộ tương ứng với hình 3
- Với hình ảnh cây cối tương ứng với hình 1
Code:
img1 = imread('/MATLAB Drive/beach.jpg');
img2 = imread('/MATLAB Drive/building.jpg');
img3 = imread('/MATLAB Drive/household.jpg');
img4 = imread('/MATLAB Drive/pedestrian.jpg');
img5 = imread('/MATLAB Drive/tree.jpg');
Arr = [2 4 6 8 10];
Arr = Arr(randperm(length(Arr)));
figure
subplot(3,4,1);imshow(img1,[]);
subplot(3,4,3);imshow(img2,[]);
subplot(3,4,5);imshow(img3,[]);
subplot(3,4,7);imshow(img4,[]);
subplot(3,4,9);imshow(img5,[]);
if size(img1, 3) == 3
img1 = rgb2gray(img1);
end
if size(img2, 3) == 3
img2 = rgb2gray(img2);
end
if size(img3, 3) == 3
img3 = rgb2gray(img3);
end
if size(img4, 3) == 3
img4 = rgb2gray(img4);
end
if size(img5, 3) == 3
img5 = rgb2gray(img5);
end
F1 = fft2(double(img1));
F2 = fft2(double(img2));
F3 = fft2(double(img3));
F4 = fft2(double(img4));
F5 = fft2(double(img5));
% Shift the zero-frequency component to the center of the spectrum
F1 = fftshift(F1);
F2 = fftshift(F2);
F3 = fftshift(F3);
F4 = fftshift(F4);
F5 = fftshift(F5);
% Compute the magnitude spectrum
F_mag1 = abs(F1);
F_mag2 = abs(F2);
F_mag3 = abs(F3);
F_mag4 = abs(F4);
F_mag5 = abs(F5);
% Display the magnitude spectrum
subplot(3,4,Arr(1));imshow(log(1+F_mag1), []);
subplot(3,4,Arr(2));imshow(log(1+F_mag2), []);
subplot(3,4,Arr(3));imshow(log(1+F_mag3), []);
subplot(3,4,Arr(4));imshow(log(1+F_mag4), []);
subplot(3,4,Arr(5));imshow(log(1+F_mag5), []);
Buổi 10: không có
Buổi 11:
Câu 1: Biến đổi Fourier
Câu 2: Gọi I là ảnh mosaic 1 lớp. Sử dụng các bộ lọc để lọc 1 cách hợp lý và nhận xét
Kết quả:
Sy1 = F .* H1;
Y1 = ifft2(ifftshift(Sy1));
Sy2 = F .* H2;
Y2 = ifft2(ifftshift(Sy2));
Sy3 = F .* H3;
Y3 = ifft2(ifftshift(Sy3));
subplot(1,3,1);
imshow(real(Y1), []);
subplot(1,3,2);
imshow(real(Y2), []);
subplot(1,3,3);
imshow(real(Y3), []);
Câu 3:
Kết quả:
Code:
image = imread('kodak/kodim10.png');
[h, w, ~] = size(image);
data = reshape(image, h*w, 3);
num_clusters = 3;
[cluster_idx, cluster_center] = kmeans_code(double(data), num_clusters);
cluster_label = reshape(cluster_idx, h, w);
avg_colors = zeros(num_clusters, 3);
for i = 1:num_clusters
cluster_data = data(cluster_idx == i, :);
avg_color = mean(cluster_data, 1);
avg_colors(i, :) = avg_color;
end
figure;
subplot(1, 2, 1);
imshow(image);
title('Original');
subplot(1, 2, 2);
imagesc(cluster_label);
axis off;
title('Result’);
colormap(gca, avg_colors/255);
Code:
import cv2
import imutils
import numpy as np
max_size = 5000
min_size = 900
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)
if detected == 1:
cv2.drawContours(img, [screenCnt], -1, (0, 255, 0), 3)
mask = np.zeros(gray.shape, np.uint8)
new_image = cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
new_image = cv2.bitwise_and(img, img, mask=mask)
(x, y) = np.where(mask == 255)
(topx, topy) = (np.min(x), np.min(y))
(bottomx, bottomy) = (np.max(x), np.max(y))
Cropped = gray[topx:bottomx + 1, topy:bottomy + 1]
cv2.imshow('Input image', img)
cv2.imshow('License plate', Cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()