中值平滑:
void MedianSmooth(BYTE* pSrc,BYTE* pDest,int nWidth,int nHeight,unsigned int Ksize)
{
int k2 = Ksize/2;
int kmax= Ksize-k2;
int i,j,k;
int nStride = nWidth*3;
RGBQUAD* kernel = (RGBQUAD*)malloc(Ksize*Ksize*sizeof(RGBQUAD));
for(int y=0; y<nHeight; y++)
{
for(int x=0; x<nWidth; x++)
{
for(j=-k2, i=0;j<kmax;j++)
{
for(k=-k2;k<kmax;k++)
{
if (IsPointInside(x+j,y+k,nWidth,nHeight))
{
int nXpos = (x+j)*3;
int nYpos = (y+k)*nStride;
int nPos = nYpos + nXpos;
int n = i++;
kernel[n].rgbBlue = pSrc[nPos];
kernel[n].rgbGreen = pSrc[nPos + 1];
kernel[n].rgbRed = pSrc[nPos + 2];
}
}
}
qsort(kernel, i, sizeof(RGBQUAD), CompareColors);
int nMid = i/2;
int nDstXpos = x*3;
int nDstYpos = y*nStride;
int nDstPos = nDstYpos + nDstXpos;
pDest[nDstPos] = kernel[nMid].rgbBlue;
pDest[nDstPos + 1] = kernel[nMid].rgbGreen;
pDest[nDstPos + 2] = kernel[nMid].rgbRed;
}
}
free(kernel);
}
均值平滑:
void AverageSmooth(BYTE* pSrc,BYTE* pDest,int nWidth,int nHeight,unsigned int Ksize)
{
int k2 = Ksize/2;
int kmax= Ksize-k2;
int i,j,k;
int nStride = nWidth*3;
int nTotalRed = 0;
int nTotalGreen = 0;
int nTotalBlue = 0;
for(int y=0; y<nHeight; y++)
{
for(int x=0; x<nWidth; x++)
{
for(j=-k2, i=0;j<kmax;j++)
{
for(k=-k2;k<kmax;k++)
{
if (IsPointInside(x+j,y+k,nWidth,nHeight))
{
int nXpos = (x+j)*3;
int nYpos = (y+k)*nStride;
int nPos = nYpos + nXpos;
int n = i++;
nTotalBlue += pSrc[nPos];
nTotalGreen += pSrc[nPos + 1];
nTotalRed += pSrc[nPos + 2];
}
}
}
int nDstXpos = x*3;
int nDstYpos = y*nStride;
int nDstPos = nDstYpos + nDstXpos;
pDest[nDstPos] = nTotalBlue/i;
pDest[nDstPos + 1] = nTotalGreen/i;
pDest[nDstPos + 2] = nTotalRed/i;
nTotalRed = 0;
nTotalGreen = 0;
nTotalBlue = 0;
}
}
}
如果觉得《RGB图像中值平滑和均值平滑》对你有帮助,请点赞、收藏,并留下你的观点哦!