幾個簡單的清晰度計算

最近在自學遊戲開發,所以博客就停下來沒有寫了,不過最近工作上要實現一些東西,所以這裏在作一些筆記,比較清晰度算法主要是爲了實現調焦,這記錄一下代碼,具體暫時不說了。


/**
 * 計算兩個相鄰像素的灰度差平方,爲了防止數值過大,我們會縮小所算出來的值,data數據爲raw單通道數據
 */
int BrennerClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0;
	for (int i = y; i < y + h_len && i < h; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		for (int j = x; j < x + w_len && j < w - 2; j += IMAGE_CHANNELS_NUMBER) {
			//計算 (f(x + 2, y) - f(x, y))的平方
			sum1 = data[tmp1 + j + 2] - data[tmp1 + j];
			sum2 += (sum1 * sum1);//防止數據溢出
		}
		sum3 += sum2 >> 1;//可以根據傳入圖片的大小更改移位的數量
		sum2 = 0;
	}
	printf(" Br=%d,",sum3);
	return sum3;
}

/**
 * 本來是計算兩個相鄰像素的灰度差平方,這裏平方改成絕對值,簡化
 */
int Brenner2Clarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0;
	for (int i = y; i < y + h_len && i < h; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		for (int j = x > 2 ? x : 2; j < x + w_len && j < w - 2; j += IMAGE_CHANNELS_NUMBER) {
			//計算 f(x + 2, y) - f(x, y)
			sum1 = data[tmp1 + j + 2] - data[tmp1 + j];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" Br2=%d,", sum3);
	return sum3;
}

/**
 * 通過使用laplacian算子計算清晰度 [1 4 1, 4 -20 4, 1 4 1]
 */
int LaplacianClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = (i - 1) * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 f(x-1, y-1) + 4*f(x, y-1) + f(x+1, y-1) + 4*f(x-1, y) - 20*f(x, y) + 4*f(x+1, y) + f(x-1, y+1) + 4*f(x, y+1) + f(x+1, y+1)
			sum1 = data[tmp1 + j - 1] + 4 * data[tmp1 + j] + data[tmp1 + j + 1]
				+ 4 * data[tmp1 + w + j - 1] - 20 * data[tmp1 + w + j] + 4 * data[tmp1 + w + j + 1]
				+ data[tmp1 + w * 2 + j - 1] + 4 * data[tmp1 + w * 2 + j] + data[tmp1 + w * 2 + j + 1];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" La=%d,", sum3);
	return sum3;
}

/**
 * 通過使用laplacian算子計算清晰度 [0 1 0, 1 -4 1, 0 1 0]
 */
int Laplacian2Clarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 f(x-1, y-1) + 2*f(x, y-1) + f(x+1, y-1) + 2*f(x-1, y) - 12*f(x, y) + 2*f(x+1, y) + f(x-1, y+1) + 2*f(x, y+1) + f(x+1, y+1)
			sum1 = data[tmp1 + j] + data[tmp1 + w + j - 1] - 4 * data[tmp1 + w + j]
				+ data[tmp1 + w + j + 1] + data[tmp1 + w * 2 + j];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" La2=%d,", sum3);
	return sum3;
}

/**
 * 兩對個附近點差的和
 */
int GrayVarianceClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0, tmp2 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		tmp2 = (i - 1) * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 |f(x, y) - f(x, y-1)| + |f(x, y) - f(x + 1, y)|
			sum1 = data[tmp1 + j] - data[tmp2 + j];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
			sum1 = data[tmp1 + j] - data[tmp1 + j + 1];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" Gr=%d,", sum3);
	return sum3;
}

/**
 * 兩對個附近點的差的乘積
 */
int VarianceProductClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum2 = 0, sum3 = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		tmp2 = (i - 1) * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 |f(x, y) - f(x, y-1)| + |f(x, y) - f(x + 1, y)|
			tmp3 = data[tmp1 + j] - data[tmp2 + j];
			tmp3 = (tmp3 < 0 ? (-tmp3) : tmp3);//絕對值
			tmp4 = data[tmp1 + j] - data[tmp1 + j + 1];
			tmp4 = (tmp4 < 0 ? (-tmp4) : tmp4);//絕對值
			sum2 += tmp3 * tmp4;
		}
		sum3 += (sum2 >> 2);//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" VaP=%d,", sum3);
	return sum3;
}

/**
 * 方差
 */
int VarianceClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0, tmp2 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		tmp2 = (i - 1) * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 |f(x, y) - f(x, y-1)| + |f(x, y) - f(x + 1, y)|
			sum1 = data[tmp1 + j] - data[tmp2 + j];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
			sum1 = data[tmp1 + j] - data[tmp1 + j + 1];
			sum2 += (sum1 < 0 ? (-sum1) : sum1);//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" Va=%d,", sum3);
	return sum3;
}

/**
 * 能量梯度
 */
int EnergyGradientClarity(const m_Byte* data, int w, int h, int x, int y, int w_len, int h_len) {
	int sum1 = 0, sum2 = 0, sum3 = 0, tmp1 = 0, tmp2 = 0;
	for (int i = y; i < y + h_len && i < h - 1; i += IMAGE_CHANNELS_NUMBER) {
		tmp1 = i * w;
		tmp2 = (i + 1) * w;
		for (int j = x > 1 ? x : 1; j < x + w_len && j < w - 1; j += IMAGE_CHANNELS_NUMBER) {
			//計算 |f(x, y) - f(x, y-1)| + |f(x, y) - f(x + 1, y)|
			sum1 = data[tmp1 + j + 1] - data[tmp1 + j];
			sum2 += sum1 * sum1;//絕對值
			sum1 = data[tmp2 + j] - data[tmp1 + j];
			sum2 += sum1 * sum1;//絕對值
		}
		sum3 += sum2;//可以根據傳入圖片的大小更改移位的數量,防止數據溢出
		sum2 = 0;
	}
	printf(" En=%d,", sum3);
	return sum3;
}

調用過程:

//這裏圖片不同自行改變
#define WIDTH_IMAGE 500
#define HEIGHT_IMAGE 374
#define X_IMAGE 40
#define Y_IMAGE 40
#define X_LEN_IMAGE 450
#define Y_LEN_IMAGE 300

#define X_IMAGE_1 100
#define Y_IMAGE_1 100
#define X_LEN_IMAGE_1 330
#define Y_LEN_IMAGE_1 200

/**
 * 讀取文件內容 val需要已經申請內存
 */
bool read_file(m_Byte* val, const char* file_name, int size) {
	FILE *fp = NULL;
	fp = fopen(file_name, "rb");
	if (fp) {
		int ret = fread(val, 1, size, fp);
		fclose(fp);
		fp = NULL;
		if (ret != size) {
			return false;
		}
		return true;
	}
	return false;
}

/**
 * 函數說明:計算特定raw文件的特定區域內的各種清晰度
 * 函數名稱:TestImageClarity2
 * 參數說明:
 *          const char* file_path:文件路徑
 *          int w:圖片寬
 *          int h:圖片高
 *          int x:計算區域起始x座標
 *          int y:計算區域起始y座標
 *          int x_len:計算區域x軸方向長度
 *          int y_len:計算區域y軸方向長度
 */
void TestImageClarity2(const char* file_path, int w, int h, int x, int y, int x_len, int y_len) {
	if (image_data) {
		int i_Brenner = 0, i_Brenner2 = 0, i_Laplacian = 0, i_Laplacian2 = 0, i_GrayVariance = 0,
			i_VarianceProduct = 0, i_Variance = 0, i_EnergyGradient = 0;
		DWORD f_Brenner = 0, f_Brenner2 = 0, f_Laplacian = 0, f_Laplacian2 = 0, f_GrayVariance = 0,
			f_VarianceProduct = 0, f_Variance = 0, f_EnergyGradient = 0;
		DWORD start, end;
		//這裏是從文件中讀取圖片,這裏的萬劍是raw,特地保存下來用於測試使用
		if (read_file(image_data, file_path, WIDTH_IMAGE * HEIGHT_IMAGE)) {
			i_Brenner = BrennerClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_Brenner2 = Brenner2Clarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_Laplacian = LaplacianClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_Laplacian2 = Laplacian2Clarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_GrayVariance = GrayVarianceClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_VarianceProduct = VarianceProductClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_Variance = VarianceClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			i_EnergyGradient = EnergyGradientClarity(image_data, WIDTH_IMAGE, HEIGHT_IMAGE, x, y, x_len, y_len);
			printf("\r\n");
		}
	}
}
...main
	image_data = (m_Byte*)malloc(WIDTH_IMAGE * HEIGHT_IMAGE * sizeof(m_Byte));
	printf("--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------\r\n");
	TestImageClarity2(FILE_NAME_1, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_2, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_3, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_4, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_5, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_6, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_7, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_8, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_9, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_10, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	printf("--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------\r\n");
	TestImageClarity2(FILE_NAME_11, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_12, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_13, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_14, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_15, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	printf("--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------\r\n");
	TestImageClarity2(FILE_NAME_21, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_22, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_23, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_24, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_25, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_26, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_27, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_28, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_29, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_30, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_31, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);
	TestImageClarity2(FILE_NAME_32, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE, Y_IMAGE, X_LEN_IMAGE, Y_LEN_IMAGE);

	//TestImageClarity(FILE_NAME_1, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_2, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_3, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_4, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_5, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_6, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_7, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_8, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_9, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_10, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_11, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_12, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_13, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_14, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	//TestImageClarity(FILE_NAME_15, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);

	printf("--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------\r\n");
	TestImageClarity2(FILE_NAME_1, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_2, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_3, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_4, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_5, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_6, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_7, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_8, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_9, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_10, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	printf("--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------\r\n");
	TestImageClarity2(FILE_NAME_11, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_12, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_13, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_14, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_15, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	printf("--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------\r\n");
	TestImageClarity2(FILE_NAME_21, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_22, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_23, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_24, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_25, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_26, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_27, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_28, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_29, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_30, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_31, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);
	TestImageClarity2(FILE_NAME_32, WIDTH_IMAGE, HEIGHT_IMAGE, X_IMAGE_1, Y_IMAGE_1, X_LEN_IMAGE_1, Y_LEN_IMAGE_1);

下面是工作上圖片的結果,使用的是灰度圖片,其實就是相機出來的是yuv420sp,所以直接取前面的y就行了:

--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=2649189, Br2=440496, La=4129014, La2=648276, Gr=685800, VaP=363256, Va=685800, En=4073036,
 Br=2870781, Br2=454673, La=4112988, La2=643728, Gr=681353, VaP=332787, Va=681353, En=4018147,
 Br=2553011, Br2=426019, La=3873890, La2=601016, Gr=640131, VaP=310297, Va=640131, En=3529673,
 Br=1786056, Br2=360452, La=3576906, La2=548929, Gr=587464, VaP=247613, Va=587464, En=2853041,
 Br=2522372, Br2=350026, La=3551591, La2=544163, Gr=559547, VaP=257215, Va=559547, En=3122672,
 Br=2238237, Br2=345552, La=3540931, La2=542125, Gr=561335, VaP=257150, Va=561335, En=2983973,
 Br=2143725, Br2=347496, La=3556670, La2=545544, Gr=560860, VaP=248697, Va=560860, En=2874356,
 Br=1713933, Br2=309166, La=3439277, La2=526587, Gr=539277, VaP=240407, Va=539277, En=2895272,
 Br=2178260, Br2=307750, La=3606353, La2=558032, Gr=547869, VaP=376932, Va=547869, En=3569163,
 Br=2172738, Br2=305264, La=3531886, La2=543386, Gr=538046, VaP=284832, Va=538046, En=3590659,
--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=2449456, Br2=334212, La=3790663, La2=589607, Gr=574383, VaP=343527, Va=574383, En=4154496,
 Br=2814830, Br2=325934, La=3481359, La2=531226, Gr=526546, VaP=246234, Va=526546, En=3190970,
 Br=1792544, Br2=298570, La=3349564, La2=509835, Gr=499378, VaP=171373, Va=499378, En=2029116,
 Br=1201457, Br2=283296, La=3338017, La2=507634, Gr=490186, VaP=151582, Va=490186, En=1632588,
 Br=748831, Br2=268146, La=3313975, La2=506594, Gr=475429, VaP=118133, Va=475429, En=1198898,
--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=3326231, Br2=473088, La=4591550, La2=735733, Gr=736443, VaP=452409, Va=736443, En=5243500,
 Br=3598854, Br2=495029, La=4356414, La2=686609, Gr=712995, VaP=386565, Va=712995, En=4769565,
 Br=3006501, Br2=463796, La=4177681, La2=657536, Gr=682001, VaP=336292, Va=682001, En=4120237,
 Br=2349986, Br2=394944, La=3848517, La2=599545, Gr=609570, VaP=268387, Va=609570, En=3224629,
 Br=2441385, Br2=381719, La=3799904, La2=590326, Gr=595808, VaP=269991, Va=595808, En=3267002,
 Br=2512034, Br2=363069, La=3682746, La2=567530, Gr=572574, VaP=269459, Va=572574, En=3146110,
 Br=1329764, Br2=307381, La=3384048, La2=513408, Gr=536140, VaP=191403, Va=536140, En=2277319,
 Br=2577448, Br2=368026, La=3733264, La2=577471, Gr=580189, VaP=266566, Va=580189, En=3300644,
 Br=2724744, Br2=359915, La=3700972, La2=571943, Gr=572297, VaP=267427, Va=572297, En=3317794,
 Br=1420168, Br2=306971, La=3493435, La2=533848, Gr=539887, VaP=197631, Va=539887, En=2528618,
 Br=2147754, Br2=321362, La=3575270, La2=548893, Gr=544597, VaP=262136, Va=544597, En=3048794,
 Br=2009198, Br2=312594, La=3526627, La2=538972, Gr=531978, VaP=214353, Va=531978, En=2699815,
--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=1695116, Br2=229883, La=2274706, La2=335276, Gr=381445, VaP=231863, Va=381445, En=2648367,
 Br=1993916, Br2=245908, La=2302495, La2=340923, Gr=385417, VaP=221540, Va=385417, En=2743917,
 Br=1730324, Br2=223311, La=2105757, La2=305710, Gr=351117, VaP=202075, Va=351117, En=2330564,
 Br=1329840, Br2=188797, La=1967210, La2=281271, Gr=326299, VaP=173350, Va=326299, En=2041170,
 Br=2171847, Br2=194287, La=1990378, La2=285440, Gr=317908, VaP=196310, Va=317908, En=2463248,
 Br=1874583, Br2=187335, La=1967920, La2=281904, Gr=315128, VaP=193269, Va=315128, En=2294095,
 Br=1787162, Br2=189448, La=1971738, La2=282023, Gr=315031, VaP=185554, Va=315031, En=2190958,
 Br=1407821, Br2=161472, La=1883212, La2=267617, Gr=299651, VaP=181875, Va=299651, En=2233162,
 Br=1846220, Br2=167695, La=2014069, La2=293021, Gr=312044, VaP=305696, Va=312044, En=2851527,
 Br=1942976, Br2=172525, La=2005992, La2=290090, Gr=313302, VaP=236239, Va=313302, En=3042143,
--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=1473884, Br2=162895, La=1956530, La2=280135, Gr=298357, VaP=188554, Va=298357, En=2167267,
 Br=1371856, Br2=145191, La=1729970, La2=237504, Gr=262017, VaP=129470, Va=262017, En=1503790,
 Br=869516, Br2=137534, La=1726638, La2=237859, Gr=257790, VaP=91943, Va=257790, En=949005,
 Br=686274, Br2=132881, La=1716474, La2=235552, Gr=254763, VaP=85823, Va=254763, En=844231,
 Br=431450, Br2=128667, La=1743897, La2=241335, Gr=251879, VaP=67689, Va=251879, En=615256,
--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=2299919, Br2=256623, La=2595404, La2=395270, Gr=420260, VaP=301302, Va=420260, En=3574143,
 Br=2416262, Br2=265924, La=2424949, La2=360872, Gr=398591, VaP=250805, Va=398591, En=3153322,
 Br=2092272, Br2=249431, La=2322368, La2=344640, Gr=380188, VaP=223445, Va=380188, En=2783447,
 Br=1843951, Br2=215858, La=2154202, La2=315830, Gr=343893, VaP=193181, Va=343893, En=2350232,
 Br=1991953, Br2=210751, La=2137389, La2=312597, Gr=338834, VaP=200753, Va=338834, En=2469731,
 Br=2127075, Br2=200976, La=2057673, La2=297605, Gr=325623, VaP=204652, Va=325623, En=2428227,
 Br=1021407, Br2=158463, La=1863528, La2=262323, Gr=296402, VaP=133767, Va=296402, En=1632381,
 Br=2207148, Br2=207599, La=2117483, La2=308417, Gr=334156, VaP=205977, Va=334156, En=2605048,
 Br=2375160, Br2=202510, La=2085414, La2=303406, Gr=328629, VaP=207759, Va=328629, En=2643318,
 Br=1115333, Br2=158522, La=1916285, La2=272048, Gr=299317, VaP=141382, Va=299317, En=1869825,
 Br=1868905, Br2=177430, La=2005178, La2=288801, Gr=311626, VaP=209062, Va=311626, En=2448591,
 Br=1761298, Br2=176168, La=1976174, La2=282239, Gr=306237, VaP=165324, Va=306237, En=2138773,
請按任意鍵繼續. . .

加了一個測試數據,換了圖片

--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=2950644, Br2=430755, La=3630177, La2=660828, Gr=613523, VaP=345459, Va=613523, En=4393180,
 Br=3136834, Br2=444705, La=3590281, La2=649349, Gr=603881, VaP=302984, Va=603881, En=4266608,
 Br=2868218, Br2=422419, La=3395888, La2=615510, Gr=576449, VaP=290112, Va=576449, En=3881243,
 Br=1879462, Br2=348156, La=2994909, La2=545234, Gr=504555, VaP=214853, Va=504555, En=2949943,
 Br=2570069, Br2=335150, La=2985019, La2=543026, Gr=473955, VaP=218478, Va=473955, En=3176771,
 Br=2311678, Br2=331258, La=2976362, La2=541579, Gr=476988, VaP=223336, Va=476988, En=3060844,
 Br=2204827, Br2=332205, La=2973826, La2=541883, Gr=473309, VaP=210435, Va=473309, En=2937804,
 Br=1704345, Br2=288376, La=2833940, La2=515860, Gr=446894, VaP=204850, Va=446894, En=2879573,
 Br=2204473, Br2=288624, La=3030206, La2=552046, Gr=461634, VaP=337588, Va=461634, En=3615285,
 Br=2180502, Br2=285414, La=2940273, La2=534697, Gr=448558, VaP=250013, Va=448558, En=3603560,
--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=2470186, Br2=316129, La=3238576, La2=593748, Gr=501660, VaP=312428, Va=501660, En=4246263,
 Br=2836676, Br2=314853, La=2948982, La2=540241, Gr=456341, VaP=219529, Va=456341, En=3268737,
 Br=1817349, Br2=281908, La=2811702, La2=515591, Gr=429108, VaP=138098, Va=429108, En=2122128,
 Br=1226401, Br2=268896, La=2801476, La2=513006, Gr=419826, VaP=120372, Va=419826, En=1717550,
 Br=767687, Br2=250176, La=2744388, La2=504881, Gr=401278, VaP=90643, Va=401278, En=1269065,
--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域一-----------
 Br=3516677, Br2=459110, La=4022622, La2=734076, Gr=656105, VaP=415730, Va=656105, En=5435477,
 Br=3954034, Br2=489964, La=3864866, La2=698460, Gr=646309, VaP=374789, Va=646309, En=5149957,
 Br=3256188, Br2=460155, La=3660818, La2=664557, Gr=612497, VaP=315580, Va=612497, En=4392445,
 Br=2464893, Br2=384980, La=3265745, La2=594676, Gr=529043, VaP=240512, Va=529043, En=3347148,
 Br=2505943, Br2=369805, La=3192246, La2=581219, Gr=509105, VaP=234778, Va=509105, En=3323381,
 Br=2563214, Br2=351122, La=3073604, La2=559073, Gr=486378, VaP=228462, Va=486378, En=3198126,
 Br=1349651, Br2=290490, La=2782974, La2=505731, Gr=446654, VaP=158838, Va=446654, En=2298456,
 Br=2623576, Br2=353442, La=3114471, La2=566263, Gr=490788, VaP=230300, Va=490788, En=3338194,
 Br=2740878, Br2=340121, La=3055529, La2=555920, Gr=478570, VaP=231679, Va=478570, En=3319987,
 Br=1429766, Br2=289081, La=2854833, La2=518965, Gr=448530, VaP=168508, Va=448530, En=2534366,
 Br=2147771, Br2=300866, La=2926322, La2=533316, Gr=449622, VaP=225487, Va=449622, En=3037949,
 Br=2009481, Br2=292295, La=2882130, La2=524339, Gr=437940, VaP=176795, Va=437940, En=2692455,
--------------場景一:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=2196558, Br2=199674, La=1950918, La2=357144, Gr=352721, VaP=252240, Va=352721, En=3202798,
 Br=2381035, Br2=214506, La=1941396, La2=352595, Gr=349362, VaP=223731, Va=349362, En=3135800,
 Br=2154502, Br2=196562, La=1820899, La2=332254, Gr=332186, VaP=214156, Va=332186, En=2849683,
 Br=1501191, Br2=161919, La=1574895, La2=288705, Gr=288448, VaP=166235, Va=288448, En=2280742,
 Br=2266403, Br2=163355, La=1565138, La2=287156, Gr=270545, VaP=178599, Va=270545, En=2605519,
 Br=1998602, Br2=158906, La=1573096, La2=287887, Gr=274131, VaP=182205, Va=274131, En=2482092,
 Br=1889489, Br2=157980, La=1566004, La2=287438, Gr=272125, VaP=170563, Va=272125, En=2365185,
 Br=1482026, Br2=136330, La=1481088, La2=271166, Gr=258690, VaP=170746, Va=258690, En=2394746,
 Br=1905455, Br2=137194, La=1618170, La2=297161, Gr=266612, VaP=288674, Va=266612, En=2991565,
 Br=1980992, Br2=142734, La=1604339, La2=293284, Gr=265331, VaP=217953, Va=265331, En=3148400,
--------------場景二:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=2138047, Br2=153467, La=1704294, La2=313006, Gr=277371, VaP=248369, Va=277371, En=3346386,
 Br=2509580, Br2=156435, La=1578890, La2=289583, Gr=256521, VaP=173422, Va=256521, En=2603740,
 Br=1612052, Br2=142797, La=1452885, La2=267763, Gr=238345, VaP=100622, Va=238345, En=1605824,
 Br=1036315, Br2=132527, La=1451501, La2=267021, Gr=231595, VaP=84765, Va=231595, En=1225894,
 Br=583262, Br2=116987, La=1387896, La2=256934, Gr=215533, VaP=56395, Va=215533, En=798997,
--------------場景三:同一個人不同調焦的圖片比較,越來越模糊(肉眼)----計算區域二-----------
 Br=2803610, Br2=221954, La=2263126, La2=415430, Gr=386887, VaP=317213, Va=386887, En=4170251,
 Br=3055339, Br2=239899, La=2150760, La2=389793, Gr=381911, VaP=281137, Va=381911, En=3870204,
 Br=2525053, Br2=225683, La=1997500, La2=364325, Gr=357591, VaP=238558, Va=357591, En=3311116,
 Br=2010609, Br2=183753, La=1721929, La2=315788, Gr=301492, VaP=186475, Va=301492, En=2582687,
 Br=2125784, Br2=179455, La=1717674, La2=314444, Gr=293970, VaP=187622, Va=293970, En=2658859,
 Br=2239805, Br2=172012, La=1642976, La2=300416, Gr=281653, VaP=187503, Va=281653, En=2607410,
 Br=1117399, Br2=132677, La=1430228, La2=261426, Gr=254981, VaP=123569, Va=254981, En=1802625,
 Br=2283915, Br2=172069, La=1660798, La2=303903, Gr=282781, VaP=187423, Va=282781, En=2723515,
 Br=2458832, Br2=169152, La=1639310, La2=299151, Gr=278354, VaP=193044, Va=278354, En=2769024,
 Br=1211491, Br2=133916, La=1501575, La2=274018, Gr=258209, VaP=133878, Va=258209, En=2045310,
 Br=1933984, Br2=147804, La=1577187, La2=289090, Gr=263047, VaP=192354, Va=263047, En=2566870,
 Br=1818749, Br2=146514, La=1543185, La2=281799, Gr=255983, VaP=145612, Va=255983, En=2245799,

上面我對圖片進行了分開,每一個分割區域中圖片清晰度(肉眼)都是越來越模糊來排列的。對於清晰度選用,由於每一秒需要處理大概十幀以上數據,所以計算儘量不能有除法,開平方等,只能由少量的乘法,儘量全部都是加法和減法,這樣計算時間纔會短,就是時間複雜度不能太高。
對於清晰度選用,我們這裏需要兩個判定標準,一個用於粗調焦下,判定清晰度,一個用於精調焦下,清晰度判定,通過上面數據,我們才用的兩個清晰度方法,第一個是br2,另一個暫定從la2和gr中選擇,具體選擇,按照實際調焦結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章