단일 채널과 16 비트 깊이의 png 이미지를 읽으려고합니다. 그 후 라인에서 픽셀 값을 찾습니다.
//read the image data in the file "MyPic.JPG" and store it in 'img'
Mat img = imread("sir.png", CV_LOAD_IMAGE_ANYDEPTH);
//Iterate through the line along which Intensity profile is required
LineIterator it(img, Point(1,1), Point(20,20), 8);
vector<Vec3b> buf;
for(int i=0; i<it.count; i++)
{
buf.push_back( Vec3b(*it) );
it++;
}
//print pixel value on the selected line
cerr << Mat(buf) << endl;
인쇄 된 값은 항상 255보다 작은 no입니다.
156, 156, 164; 153, 153, 152; 154, 154, 139; 179, 179, 180; 182, 182, 176; 2
208, 167; 144, 144, 163; 204, 204, 206; 180, 180, 187; 174, 174, 170; 150, 1
162; 154, 154, 170; 157, 157, 181; 181, 181, 159; 164, 164, 152; 130, 130, 1
166, 166, 181; 153, 153, 170; 153, 153, 176; 180, 180, 198]
이것은 실제로이 이미지를 16 비트 대신 8 비트로 읽는다는 것을 의미합니다.
MATLAB에서 내 이미지를 확인했으며 다음과 같이 16 비트에 유효한 값을 볼 수 있습니다.
d=imread('sir.png');
buf = improfile( d, [1 20], [1 20] )
다음과 같은 출력을 제공합니다.
65535 40092 39321 39578 46003 46774 53456 37008 52428 46260 44718 38550 39578 40349 46517 42148 33410 42662 39321 39321
opencv의 결과가 실제와 다른 이유는 무엇입니까? 16 비트 값을 표시하도록 이미지를 올바르게 읽으려면 어떻게해야합니까?
최신 정보
Roger의 답변에 따라 다음과 같이 코드를 업데이트했습니다.
LineIterator it(img, Point(1,1), Point(20,20), 8);
vector<ushort> buf;
for(int i = 0; i < it.count; i++)
{
buf.push_back(img.at<ushort>(it.pos()));
}
cerr << Mat(buf) << endl;
하지만 이제 모든 픽셀 값이 40092로 나오고 있는데 이는 MATLAB 출력에 비해 잘못되었습니다.
Vec3b
픽셀을 처리 하기 위해를 사용하고 있습니다 . 이것은 int 8 비트 청크를 잘라냅니다.
사용 Vec3s
대신에 Vec3b
. 16 비트 픽셀을 얻을 수 있습니다. 이것은 16 비트 그레이 스케일의 한 채널 (내 생각에 PNG에서 얻을 수있는 것임)이 아니라 16 비트의 3 채널이 있다고 가정합니다.이 경우 at<ushort>(y,x)
예를 들어 액세스 합니다.
LineIterator it(img, Point(1,1), Point(20,20), 8);
vector<ushort> buf;
for(int i = 0; i < it.count; i++, it++)
{
buf.push_back(img.at<ushort>(it.pos()));
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다