【发布时间】:2015-05-27 09:54:53
【问题描述】:
我有一个包含大量噪音的 Mat 数组 我只想去除图像中的噪点,但保留图像中的明亮物体。图像的类型为 CV_16S,因此在比例尺上(-32677、32676)。我尝试做 fastNLdenoise,但显然它只适用于 CV_8UC3,如果我尝试将这些图像转换为 CV_8UC3,我会得到一个纯白色的图像。
for(long int FrameNumber = startFrame; FrameNumber < endFrame; FrameNumber++){
fp.seekg( BytesPerFrame*(FrameNumber), std::ios::beg);
char buffer[BytesPerImage];
fp.read(buffer, BytesPerImage);
short image[512*512];
short min = 20000, max=1000;
for ( int i = 0; i < BytesPerImage; i=i+2 )
{
int a;
a = floor(i/2)+1;
// take first character
image[a] = (static_cast<unsigned int>(static_cast<unsigned char>(buffer[i+1]))*256+static_cast<unsigned int>(static_cast<unsigned char>(buffer[i])));
if(image[a] < min){
min = image[a];
}
if(image[a] > max){
max = image[a];
}
}
// Processing the image
Mat img(512, 512, CV_16S , image);
img -= (min);
img *= (32676/max); // (330000/2500);
img *= ((max/min)/2) + 2; // 16;
imgArr[FrameNumber-startFrame] = img.clone();
}
Mat mean = ((imgArr[0].clone())/numFrames);
namedWindow( "Mean", WINDOW_AUTOSIZE );// Create a window for display.
for(int i = 1; i<numFrames; i++){
mean += (imgArr[i]/numFrames);
waitKey(50);
}
imshow("Mean", mean);
for(int i = 0; i<numFrames; i++){
Mat temp = imgArr[i].clone();
subtract(imgArr[i].clone(), mean, temp);
GaussianBlur(temp, temp, Size(3,3), 1.5);
imgArr[i] = temp.clone();
}
生成的示例图像如下所示: http://s11.postimg.org/nnhxr7j1f/Screen_Shot_2015_05_27_at_2_51_27_AM.png
【问题讨论】:
-
或许展示你的代码会对你有所帮助!
-
您要对这张彩色 16 位输入图像进行降噪处理吗?是你想要保留的那个白色小区域吗?
-
是的。这是我们必须在一系列图像中跟踪的对象,但由于噪声非常高,堆叠和应用霍夫变换或光流跟踪或轮廓映射等过程会由于检测到所需对象的噪声而失败。
标签: c++ opencv image-processing graphics opencv3.0