本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/50904358
昨天一个朋友,向我求助,帮忙去除掉一组遥感影像数据中,因为裁剪时产生的全黑图像,实现起来也很简单,就将工程代码提供给大家:
GitHub链接:yhlleo/ImageFormatConversion
图像格式为单通道16-bit的tif
,可以使用OpenCV库读取:
cv::Mat curImage = cv::imread(fileName, IMREAD_UNCHANGED);
因为图像是16-bit的,所指使用图片查看器,浏览的话,肯定是全黑的。但是可以在Photoshop中,调整灰度曲线,显示图片内容(将曲线调成近似直角折线):
那些黑色图像(真的是全黑,像素值为0),判断方法比较简单,获取图像灰度最大最小值,区间范围是0,必然是全黑图像:
double pMax = 0, pMin = 0;
cv::minMaxIdx(curImage, &pMin, &pMax);
int pRange = pMax - pMin;
if ( pRange > 0 )
{
// ...
}
else
{
// Black image
// ...
}
如果想把16-bit图像转为常见的8-bit图像,我使用的方法是这样的:
if( pRange > 0 )
{
for ( int i=0; i<rows*cols; ++i )
{
int pValue = ( static_cast<int>(*++data_cur & 0xffff) - ipMin ) * 255 / pRange;
data_trans[i] = static_cast<uchar>(pValue);
}
}
即,使用简单的线性拉伸方法: