01/10/2018, 08:37

Phân đoạn, phân vùng ảnh, dựa vào phương sai và trung bình của ảnh- Xử lý ảnh, Opencv

chào các bạn
mình đang cần phân đoạn ảnh sau, tìm ra vùng có vân tay thật sự
mình sử dụng phương pháp phân vùng dựa vào miền đồng nhất

bằng cách chia ảnh xám thành các khối vuông m x m
sau đó tính phương sai của ảnh ( tính trùng bình ảnh), rồi so sánh với ngưỡng, nến lớn hơn 1 ngưỡng nào đó thì gán nó vào vùng ảnh, còn ngược lại thì là vùng nền
công thức tính trung bình ảnh và phương sai của anh

nhưng mình đang loay hoay ơ chỗ, ngưỡng phương sai tổng thể là gì, với là bao nhiêu, lấy dựa vào cơ sở nào,
mình đã tách ảnh thành các block 16 x 16
giờ tính phương sai, xong so sánh thì ghép nó lại ảnh 1 Mat ntn, vì mình tách từ 1 ảnh xám, thành nhiều ảnh xám cỡ 16 x 16 và tống nó vào 1 vector < Mat>
mình làm bằng c++
xin cam ơn

tính trung bình ảnh mình làm như sau

float trung_binh_anh(Mat &khoivuong){
	int w = 16;
	int tb= 0 ;
	for (int i = 0; i < w ; i++){
		for (int j = 0; j < w; j++){
			tb += (int) khoivuong.at<uchar>(i, j);
		}
	}
	return tb * (float)1/(w*w);
}

tính phương sai như sau

float phuong_sai_anh(Mat &khoivuong){
	int w = 16;
	float ps= 0 ;
	float tba = trung_binh_anh(khoivuong);
	for (int i = 0; i < w; i++){
		for (int j = 0; j < w; j++){
			float temp = (int)khoivuong.at<uchar>(i, j) - tba;
			ps += (temp * temp);
		}
	}
	return ps * (float) 1/(w*w);
}

cắt block 16x16 như sau, ảnh mình đã resize về 512, 608 để tròn số

vector <Mat> phandoan;
Size kichthuoc_kv(16, 16);
for (size_t i = 0; i < vantay.rows; i += kichthuoc_kv.height){
	for (size_t j = 0; j < vantay.cols; j += kichthuoc_kv.width){
		Rect khoivuong(j, i, kichthuoc_kv.width, kichthuoc_kv.height);
		phandoan.push_back(Mat(vantay, khoivuong));
	}
}
HelloWorld viết 10:52 ngày 01/10/2018

help help help

HelloWorld viết 10:48 ngày 01/10/2018

help hellp help

HelloWorld viết 10:38 ngày 01/10/2018

help help help

Bài liên quan
0