二值化怕阴影吗

篮球比赛规则2023-04-26  28

二值化是将图像转化为只有黑白两色的处理方法,通常得到的结果是黑色和白色的二值图像。阴影对于二值化也会有影响,特别是在光照条件不一致的情况下。如果阴影较多,可能会使得二值化后的图像有一些噪点和误差。因此,在进行二值化处理时,最好考虑到阴影的影响并进行适当的处理。

因素只有一个,就是阈值,因为就这一个参数。选过高,图像一片白,选过低,一片黑,都导致图像细节的丧失。

最佳的选择当然是看直方图,选择中间的谷点。但如果整幅图像的灰度分布在空间并不均匀,就会导致二值化后的整体效果不佳。

办法有很多,最基本的就是分割成条、或成块,对每个块选取最适合的阈值进行二值化,这叫做自适应二值化,可获得最佳效果。

详细吧?

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步骤更好等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

转载请注明原文地址:https://juke.outofmemory.cn/read/3686168.html

最新回复(0)