这几天使用freeimage感觉很不错
以前大致使用了点devil
这个freeimage就是一个头文件一个静态库,一个动态库感觉很方便的
其使用大致如下(以后要时间),再写点代码
使用 FreeImage_Initialise();来初始化库
使用 FreeImage_DeInitialise();来卸载库
通过以下代码来载入文件
fif = FreeImage_GetFileType(filename, 0);
if(fif == FIF_UNKNOWN)
fif = FreeImage_GetFIFFromFilename(filename);
if(fif == FIF_UNKNOWN)
return false;
if(FreeImage_FIFSupportsReading(fif))
dib = FreeImage_Load(fif, filename);
if(!dib)
return false;
获取位图数据
bits = FreeImage_GetBits(dib);
高和宽
width = FreeImage_GetWidth(dib);
height = FreeImage_GetHeight(dib);
在数据处理完之后别忘了 FreeImage_Unload(dib);
另外可以通过FreeImage_GetVersion来获取当前版本
通过FreeImage_Allocate来分配一个新的空间,其bpp一般设置为24
FreeImage_Save为文件保存
FreeImage_GetBits为获取数据指针
FreeImage_SetPixelColor为设置指定点的颜色
FreeImage_GetBPP为获取位深
FreeImage_Threshold为设置阈值
FreeImage_Dither为彩色图片灰度处理,其需要一个涉及抖动算法的参数
FreeImage_RotateClassic为图型旋转,可选角度为0,90,180,270
FreeImage_FlipHorizontal,FreeImage_FlipVertical这二个为图形翻转 逆时针的
FreeImage_Rescale为图形缩放 第二个参数为滤波算法
主要涉及的就这么多了
在逐个处理像素的情况下,感觉直接取一行像素再处理的话比较好。
另外,对于256色变为0-1黑白图
采用网上的大律法 (OTUS)做出来的效果感觉很不错
如下:
int otsu (unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy)
{
unsigned char *np; // 图像指针
int thresholdValue=1; // 阈值
int ihist[256]; // 图像直方图,256个点
int i, j, k; // various counters
int n, n1, n2, gmin, gmax;
double m1, m2, sum, csum, fmax, sb;
// 对直方图置零...
memset(ihist, 0, sizeof(ihist));
gmin=255; gmax=0;
// 生成直方图
for (i = y0 + 1; i < y0 + dy - 1; i++) {
np = ?[i*cols+x0+1];
for (j = x0 + 1; j < x0 + dx - 1; j++) {
ihist[*np]++;
if(*np > gmax) gmax=*np;
if(*np < gmin) gmin=*np;
np++; /* next pixel */
}
}
// set up everything
sum = csum = 0.0;
n = 0;
for (k = 0; k <= 255; k++) {
sum += (double) k * (double) ihist[k]; /* x*f(x) 质量矩*/
n += ihist[k]; /* f(x) 质量 */
}
if (!n) {
// if n has no value, there is problems...
fprintf (stderr, "NOT NORMAL thresholdValue = 160/n");
return (160);
}
// do the otsu global thresholding method
fmax = -1.0;
n1 = 0;
for (k = 0; k < 255; k++) {
n1 += ihist[k];
if (!n1) { continue; }
n2 = n - n1;
if (n2 == 0) { break; }
csum += (double) k *ihist[k];
m1 = csum / n1;
m2 = (sum - csum) / n2;
sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
/* bbg: note: can be optimized. */
if (sb > fmax) {
fmax = sb;
thresholdValue = k;
}
}
return(thresholdValue);
}