Thì sao? Công thức cũng sử dụng dc cho cả ảnh to 320x320 chứ có gì khác đâu, i: 0->319
Xử lý ảnh: Thuật toán gabor dùng để nâng cao chất lượng ảnh vân tay?
ở đây, ng ra đang cắt ảnh to ra các block, mục đích là tính để phân vùng mà, tính cả ảnh to để làm gì ta
đó chỉ là công thức tổng quát
Để tính giá trị tổng thể :))
không, ý là,
1 ảnh to 512, 608
giờ cần tìm ra vùng nào đó
thì mình dùng pp phân vùng theo miền đống nhất
cắt ảnh trên ra thành 1216 block cỡ 16.16
rồi tính phương sai
và so sánh với ngưỡng
nều >= ngưỡng thì là vùng ảnh
ngược lại là vùng nền
nếu như bạn tìm phương sai tổng thể bằng cách tình phương sai cho toàn bộ ảnh
thì liệu có tìm ra được vùng cân phân
bài cũ của mình ở đây
cụ thể hơn
phương sai tổng thể ng ta trong 1 số đề tài họ lấy 40, nhưng với đề tài của mình
lấy 40 thì chả có thằng nào < 40
mà tùy vào ảnh ,chất lượng ảnh khác nhau sẽ có phương sai khác nhau
nếu lấy ngưỡng cứng thì k phù hợp nhỉ
Ý t là cái ngưỡng (aka: phương sai tổng thể) đấy dường như là phương sai tính trên toàn bộ ảnh to ban đầu
ý bạn ngưỡng ở đây là phương sai tổng thể là phương sai của toàn bộ ảnh à
còn 1 ý nưa, mình tách block xong, làm sao ghép lại nhỉ opencv
Cảm giác như thế
Chứ k phải tách ở đâu thì nhét lại vào đấy à
bạn có thể cụ thể hơn k, mong giúp đỡ, mình đang làm đề tài thực tập cơ sở, mắc chỗ gabor 1 tuần rồi
Thì VD 1 mảng offset từ 0->99, tách ra 4 đoạn 25 (0-24), offset trong mảng gốc là 0-24, 25-49, 50-74, 75-99. Thì xử lý chán chê mỗi đoạn kia xong lại tổng hợp lại thành mảng 100 dựa theo offset gốc kia thôi
ý là mình có 1 ảnh (512, 608)
giờ mình duyệt ảnh gốc
với block 16.16
rồi mỗi lần duyệt
tính phương sai rồi so sánh với ngưỡng tổng thể
rồi nếu < hơn thì làm gì ấy
ý mình là xử lý
trong opencv
với cái Mat ảnh đó
thì làm thế nào
hay là block nào < ngưỡng thì set = 255 cho nó về trắng
T chỉ nói về ý tưởng thuật toán thôi, chứ còn implement thế nào thì tùy mục đích, set trắng set đen thì cũng nhằm phân chia 2 vùng rõ rệt thôi mà, tất nhiên là được.
mình thử lấy ngưỡng tổng thể theo bạn nói coi nó có ra vùng k đã
nhưng nếu tính phương sai của khối, thì có phải resize nó về ma trận vuông k nhỉ, vì phương sai và trung bình ảnh, có nhân với 1/n^2 với n là kích thước block
giờ tính phương sai của cả ảnh thì kích thước n lấy sô cột * hàng của ma trận gốc, hay là resize ma trận ảnh gốc về ma trận vuông
k được bạn ơi
mình thử
với ảnh gốc = 512, 608
m tình được phương sai tổng thể của toàn ảnh là 4290
sau đó mình duyệt ảnh gốc
cắt ra block 16 x 16
thì được 1216 block
nhưng số block có phương sai < phương sai tổng thể là 1169 block
có nghĩa là số block nền > nhiều so với block vùng ảnh
mình code như sau
tìm trung bình ảnh
int trung_binh_anh(Mat &khoivuong, int w1, int w2){
int tb= 0 ;
for (int i = 0; i < w1 ; i++){
for (int j = 0; j < w2; j++){
tb += (int) khoivuong.at<uchar>(i, j);
}
}
return (int)tb * (float)1/(w1*w2);
}
tìm phương sai ảnh
int phuong_sai_anh(Mat &khoivuong, int w1, int w2){
float ps= 0 ;
float temp;
float tba = trung_binh_anh(khoivuong, w1,w2);
for (int i = 0; i < w1; i++){
for (int j = 0; j < w2; j++){
temp = (int)khoivuong.at<uchar>(i, j) - tba;
ps += (temp * temp);
}
}
return (int) ps * (float) 1/(w1*w2);
}
tìm vùng và nền
resize(vantay, vantay, Size(512, 608), 0, 0, INTER_LINEAR);
//
int nguongtongthe = phuong_sai_anh(vantay, vantay.rows, vantay.cols);
cout << "nguong tong the " << nguongtongthe << endl << endl;
Size kichthuoc_kv(16, 16);
int dem = 0, dem2 = 0;
for (int i = 0; i < vantay.rows; i += kichthuoc_kv.height){
for (int j = 0; j < vantay.cols; j += kichthuoc_kv.width){
dem2++;
Rect khoivuong(j, i, kichthuoc_kv.width, kichthuoc_kv.height);
cout << phuong_sai_anh(Mat(vantay, khoivuong),16,16) << endl;
if (phuong_sai_anh(Mat(vantay, khoivuong),16,16) < nguongtongthe){
dem++;
for (int x = i; x < 16; x++){
for (int y = j; y < 16; y++){
vantay.at<uchar>(x, y) = 255;
}
}
}
}
}
cout << endl << dem << endl << dem2 << endl;