Xử lý ảnh: Thuật toán gabor dùng để nâng cao chất lượng ảnh vân tay?

Cảm giác như thế :smile:

1 Like

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 :stuck_out_tongue:

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.

1 Like

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?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?