Tôi đang sử dụng tập dữ liệu trong đó có hình ảnh trong đó mỗi pixel là một bit không dấu 16 bit lưu trữ giá trị độ sâu của pixel đó tính bằng mm. Tôi cố gắng để hình dung đây là một hình ảnh sâu xám bằng cách làm như sau:OpenCV: Cách hiển thị hình ảnh độ sâu
cv::Mat depthImage;
depthImage = cv::imread("coffee_mug_1_1_1_depthcrop.png", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); // Read the file
depthImage.convertTo(depthImage, CV_32F); // convert the image data to float type
namedWindow("window");
float max = 0;
for(int i = 0; i < depthImage.rows; i++){
for(int j = 0; j < depthImage.cols; j++){
if(depthImage.at<float>(i,j) > max){
max = depthImage.at<float>(i,j);
}
}
}
cout << max << endl;
float divisor = max/255.0;
cout << divisor << endl;
for(int i = 0; i < depthImage.rows; i++){
for(int j = 0; j < depthImage.cols; j++){
cout << depthImage.at<float>(i,j) << ", ";
max = depthImage.at<float>(i,j) /= divisor;
cout << depthImage.at<float>(i,j) << endl;
}
}
imshow("window", depthImage);
waitKey(0);
Tuy nhiên, nó chỉ hiển thị hai màu sắc này là bởi vì tất cả các giá trị được gần nhau tức là trong khoảng 150-175 + các giá trị nhỏ hiển thị màu đen (xem bên dưới).
Có cách nào để chuẩn hóa dữ liệu này như vậy mà nó sẽ hiển thị mức độ xám khác nhau để làm nổi bật những khác biệt sâu nhỏ?
Tôi không thấy lý do tại sao mở rộng nó bằng 255/max (sam như tôi chia tất cả các phần tử bằng max/255) sẽ làm cho nó sử dụng đầy đủ. Ý tôi là, và tôi sẽ chấp nhận câu trả lời nhưng tôi không hiểu. Chức năng đó đang làm gì khác? – Aly
[convertScaleAbs] (http: //docs.opencv.Hàm org/modules/core/doc/operations_on_arrays.html? highlight = convertscaleabs # cv.ConvertScaleAbs) thực hiện 3 thao tác: scale, tính toán giá trị tuyệt đối và chuyển đổi thành kiểu 8 bit không dấu. Đó là lý do tại sao các yếu tố 255/max đảm bảo phạm vi đầy đủ ([0-255] cho unsigned 8-bit) được sử dụng. Hơn nữa, như @sammy đã đề cập, phạm vi động của hình ảnh được điều chỉnh được sử dụng tốt hơn bằng cách tính đến giá trị tối thiểu của dữ liệu của bạn. – samota