Cảm giác như thế
Xử lý ảnh: Thuật toán gabor dùng để nâng cao chất lượng ảnh vân tay?
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;
help help help
who can help me?