图像加减法运算

图像加减法运算

      在网络中介绍图像的加减的知识点的比较多,但很少详细介绍,多少言简意赅,留给人很多遐想。但实际使用过程中图像的加减法比较常用,比如加法在噪声处理、减法在图像差异等方面的运用。现将图像加减法这部分理解如下:

 

      在实际中,大多数图像像素由3个8位码组成(RGB),因此像素值的大小为0到255。在图像减法中,像数值的取值范围为-255到255,这一结果超过范围。暂时处理方法二种:

       1,对相减后每个像素再加255,然后除以2。该方法优点:实现简单、速度快;缺点:在计算中精确度降低。

       2,首先找到相减后的最小值,然后把相减后像数值都加上最小值的绝对值,接着找出其最大值MaxValue,最后每个像数乘以255/MaxValue.该方法优点:精确度高,缺点:速度慢。

 

方法二实现:

//src1, src2, dst必须为同大小的图像 void rtImageSub(RtImage* src1, RtImage* src2, RtImage* dst) { int x = 0, y = 0, ch = 0; int maxV = 0, minV = 255; char val = 0; char* temp = (char*)malloc(src1->width* src1->height* src1->nChannels); for (y = 0; y < src1->height; y++) { for (x = 0; x < src1->width; x++) { for (ch = 0; ch < src1->nChannels; ch++) { val = *(src1->pData + y * src1->width + x + ch) - *(src2->pData + y * src1->width + x + ch); if (val > maxV) maxV = val; if (val < minV) minV = val; *(temp+ y * src1->width + x + ch) = val; } } } minV = abs(minV); maxV += minV; for (y = 0; y < src1->height; y++) { for (x = 0; x < src1->width; x++) { for (ch = 0; ch < src1->nChannels; ch++) { val = *(temp+ y * src1->width + x + ch) + minV; *(dst->pData + y * src1->width + x + ch) = (unsigned char)((double)val*(double)255/(double)maxV); } } } free(temp); } void rtImageAdd(RtImage* src1, RtImage* src2, RtImage* dst) { int x = 0, y = 0, ch = 0; int maxV = 0; char val = 0; char* temp = (char*)malloc(src1->width* src1->height* src1->nChannels); for (y = 0; y < src1->height; y++) { for (x = 0; x < src1->width; x++) { for (ch = 0; ch < src1->nChannels; ch++) { val = *(src1->pData + y * src1->width + x + ch) + *(src2->pData + y * src1->width + x + ch); if (val > maxV) maxV = val; *(temp+ y * src1->width + x + ch) = val; } } } for (y = 0; y < src1->height; y++) { for (x = 0; x < src1->width; x++) { for (ch = 0; ch < src1->nChannels; ch++) { val = *(temp+ y * src1->width + x + ch); *(dst->pData + y * src1->width + x + ch) = (unsigned char)((double)val*(double)255/(double)maxV); } } } free(temp); }

你可能感兴趣的:(图像处理)