二值化是将图像转化为只有黑白两色的处理方法,通常得到的结果是黑色和白色的二值图像。阴影对于二值化也会有影响,特别是在光照条件不一致的情况下。如果阴影较多,可能会使得二值化后的图像有一些噪点和误差。因此,在进行二值化处理时,最好考虑到阴影的影响并进行适当的处理。
因素只有一个,就是阈值,因为就这一个参数。选过高,图像一片白,选过低,一片黑,都导致图像细节的丧失。
最佳的选择当然是看直方图,选择中间的谷点。但如果整幅图像的灰度分布在空间并不均匀,就会导致二值化后的整体效果不佳。
办法有很多,最基本的就是分割成条、或成块,对每个块选取最适合的阈值进行二值化,这叫做自适应二值化,可获得最佳效果。
详细吧?
1。把图像重新symbolize,使用classify分成两种类型,如:0-126,126-255。(把图象二值化),
在图象上鼠标右击,选取properties,在选symbolgy标签,在show中选classified,classes等于2。
2在arcCatalog中新建shp文件(分几层建几个,有点、线、多边形、多点四种类型),将图象和SHP文件一起加入到ARCMAP中,对SHP文件进行编辑,此时可以激活arcscan,进行矢量化。
后面我们的数字化工作是对这个校准后的影像进行操作的。
通过上面的操作我们的数据已经完成了配准工作,我们将使用这些配准后的影像进行分层矢量化。
bmp图像的二值化有很多种方法,最简单的就是阈值分割
当某像素值>阈值
就置像素值为255
当某像素值<阈值
就置像素值为0
这个时候还得确定你处理的bmp图像是多少bits的,一般情况下处理24位的居多,我这有一个用C语言写的图像二值化的程序,如果想要的话,把邮箱留一下,发给你。
#include <stdioh>
#include <stdlibh>
#include <conioh>
#pragma pack(1)
#define R 30
#define G 59
#define B 11
#define ONE 255
#define ZERO 0
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;
typedef struct tagPOINT{
BYTE b;
BYTE g;
BYTE r;
} POINT;
int quit();
int quit()
{
puts("File's format wrong");
exit(0);
}
void main (int argc,char argv[])
{
FILE fi,fo;//I/O file
char fin[80],fon[80];//I/O file name
BYTE buff,o=0;
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
POINT p;
int i,j,t;
if(argc<3)
{
printf("orginfile name:");
scanf("%s",fin);
printf("resultfile name:");
scanf("%s",fon);
}else{
sscanf(argv[1],"%s",fin);
sscanf(argv[2],"%s",fon);
}
if(argc==4)
sscanf(argv[4],"%d",&t);
else{
printf("theshold [0,255]:");
scanf("%d",&t);
}
if (((fi=fopen(fin,"rb"))==NULL)||((fo=fopen(fon,"wb"))==NULL))
{
puts("\nfile open failed");
return;
}
fread(&bf,sizeof(bf),1,fi);
fread(&bi,sizeof(bi),1,fi);
if(bfbfType!=0x4d42) quit();
if(bfbfReserved1!=0x0000) quit();
if(bfbfReserved2!=0x0000) quit();
if(bibiClrImportant!=0) quit();
if(bibiBitCount!=0x18) quit();
if(bibiCompression!=0) quit();
if(bibiPlanes!=1) quit();
bfbfSize=54+1024+bibiWidthbibiHeight;
bfbfOffBits=54+1024;
if(bibiWidth%4==0)
bibiSizeImage=bibiWidthbibiHeightbibiBitCount/8;
else
bibiSizeImage=(bibiWidth-(bibiWidth%4)+4)bibiHeightbibiBitCount/8;
bibiBitCount=8;
p=(POINT )malloc(sizeof(POINT )bibiHeight);
for (i=0;i<bibiHeight;i++)
(p+i)=(POINT )malloc(sizeof(POINT)bibiWidth);
//分配失败后果自负!
fwrite(&bf,sizeof(bf),1,fo);
fwrite(&bi,sizeof(bi),1,fo);
for (i=0;i<bibiHeight;i++)
for (j=0;j<bibiWidth;j++)
fread((p+i)+j,sizeof(POINT),1,fi);
for (i=0x00,buff=0x00;i<=0xFF;i++,buff++)
{
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&buff,sizeof(buff),1,fo);
fwrite(&o,sizeof(o),1,fo);
}
for (i=0;i<bibiHeight;i++)
for (j=0;j<bibiWidth;j++)
{
buff=(((p+i)+j)->rR+((p+i)+j)->gG+((p+i)+j)->bB)/100;
buff=(buff>=tONE:ZERO)
fwrite(&buff,sizeof(buff),1,fo);
}
fclose(fo);
}
level = graythresh(I) 计算全局阈值(level) ,该阈值可以用在将强度图像转换为二进制图像的函数 im2bw 中。level 是在[0, 1]内归一化的强度值。这个是全局阈值的选取,matlab自带的函数。
I=imread(' c4jpg ');%读入一幅图
subplot(2,3,1);
imshow(I);
title('原始图像');
level = graythresh(I);
I1=im2bw(I,level);
subplot(2,3,2);
imshow(I1);
title('二值图像');
二值化在ENVI中可以通过band math来实现。band math是利用简单的算术表达式来解决波段运算的功能。二值化的实现,需要用到band math的逻辑运算功能,具体的表达式的书写,你可以查看帮助文件,或者找一本操作指南看看。举个例:将某一波段中灰度值大于等于100的像元赋予10,其他的赋予20。那么表达式就写为:(b1 ge 100)20+(b1 lt 100)10ge 、lt分别表示“大于等于”和“小于”括号内是一个逻辑运算表达式,所以其返回值是0(假)和1(真)。那么,一旦某一像元灰度值大于等于100,第一个括号返回值为1,加号之前的运算的结果就为20;当然,此时该像元得灰度值代入到第二个括号内计算的返回值为0。这样,针对着一个像元,其最终输出之后为20。band math 就是这样一个一个像元进行计算的。
以上就是关于二值化怕阴影吗全部的内容,包括:二值化怕阴影吗、影响图像二值化效果的因素是什么、图像二值化的方法和步骤,能有具体的比如ARCGIS或者ENVI步骤更好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!