基于C++的图像边缘检测技术

    xiaoxiao2021-03-25  25

    .h typedef struct ColorImageMes { RGBQUAD** BYImageData; //彩色图像像素数据 double** DOImageData; _In_ int Height; //图像高 _In_ int Width; //图像宽 } ColorimageMes; class ColorScaleHood : public CObject { public: void Color_Soble_Side(ColorImageMes source, ColorImageMes &result, int Mode); void Color_Laplacian_Side(ColorImageMes source, ColorImageMes &result, int mode); }; .cpp #include "Colorscale.h" //基于Sble算子的边缘检测 **source:原彩图 **result:结果图 **m_nWidth:图像的宽 **m_nHeight:图像的高 **Mode; 0 灰度化 1 二值化 **:status:finfish /// void ColorScaleHood::Color_Soble_Side(ColorImageMes source, ColorImageMes &result, int Mode) { int i, j, a, aHr, aHg, aHb, aVr, aVg, aVb, aH, aV; double scale = 1; //1 result.BYImageData = new RGBQUAD*[source.Height]; result.BYImageData[0] = new RGBQUAD[source.Width]; result.BYImageData[source.Height-1] = new RGBQUAD[source.Width]; for (i = 1; i < source .Height- 1; i++) { result.BYImageData[i] = new RGBQUAD[source.Width]; for (j = 1; j < source .Width- 1; j++) { //计算红色分量水平灰度 aHr = abs((source.BYImageData[i - 1][j - 1].rgbRed + source.BYImageData[i - 1][j].rgbRed * 2 +source.BYImageData[i - 1][j + 1].rgbRed) - (source.BYImageData[i + 1][j + 1].rgbRed + source.BYImageData[i + 1][j].rgbRed * 2 + source.BYImageData[i + 1][j - 1].rgbRed)); //计算红色分量垂直灰度 aVr = abs((source.BYImageData[i - 1][j - 1].rgbRed + source.BYImageData[i][j - 1].rgbRed * 2 + source.BYImageData[i + 1][j - 1].rgbRed) - (source.BYImageData[i - 1][j + 1].rgbRed + source.BYImageData[i][j + 1].rgbRed * 2 + source.BYImageData[i + 1][j + 1].rgbRed)); //计算绿色分量水平灰度 aHg = abs((source.BYImageData[i - 1][j - 1].rgbGreen + source.BYImageData[i - 1][j].rgbGreen * 2 + source.BYImageData[i - 1][j + 1].rgbGreen) - (source.BYImageData[i + 1][j + 1].rgbGreen + source.BYImageData[i + 1][j].rgbGreen * 2 + source.BYImageData[i + 1][j - 1].rgbGreen)); //计算绿色分量垂直灰度 aVg = abs((source.BYImageData[i - 1][j - 1].rgbGreen + source.BYImageData[i][j - 1].rgbGreen * 2 + source.BYImageData[i + 1][j - 1].rgbGreen) - (source.BYImageData[i - 1][j + 1].rgbGreen + source.BYImageData[i][j + 1].rgbGreen * 2 + source.BYImageData[i + 1][j + 1].rgbGreen)); //计算蓝色分量水平灰度 aHb = abs((source.BYImageData[i - 1][j - 1].rgbBlue + source.BYImageData[i - 1][j].rgbBlue * 2 + source.BYImageData[i - 1][j + 1].rgbBlue) - (source.BYImageData[i + 1][j + 1].rgbBlue + source.BYImageData[i + 1][j].rgbBlue * 2 + source.BYImageData[i + 1][j - 1].rgbBlue)); //计算蓝色分量垂直灰度 aVb = abs((source.BYImageData[i - 1][j - 1].rgbBlue + source.BYImageData[i][j - 1].rgbBlue * 2 + source.BYImageData[i + 1][j - 1].rgbBlue) - (source.BYImageData[i - 1][j + 1].rgbBlue + source.BYImageData[i][j + 1].rgbBlue * 2 + source.BYImageData[i + 1][j + 1].rgbBlue)); //计算水平综合灰度差 aH = aHr + aHg + aHb; //计算垂直综合灰度差 aV = aVr + aVg + aVb; if (1) { if (aH > aV) a = aH; else a = aV; } else a = (aH + aV) / 2; a = a*scale; switch (Mode) { case 0:a = a > 255 ? 255 : a; break; //灰度化 case 1:a = a > 255 ? 0 : 255; break; //二值化 255为白色,0为黑色 default:a = a > 255 ? 255 : a; break; //灰度化 } result.BYImageData[i][j].rgbBlue = result.BYImageData[i][j].rgbGreen = result.BYImageData[i][j].rgbRed = a; } } result.Height = source.Height; result.Width = source.Width; } /// //基于拉布拉斯算子的边缘检测 **source:原彩图 **result:结果图 **m_nWidth:图像的宽 **m_nHeight:图像的高 **mode:0 显示正边缘 1 显示负边缘 2 显示所有边缘 3 对比两种边缘 **255为白色,0为黑色 **:status:finfish void ColorScaleHood::Color_Laplacian_Side(ColorImageMes source, ColorImageMes &result,int mode) { int templt[9] = { 1, 1, 1, 1, -8, 1, 1, 1, 1 }; //正向模板 double scale = 1; int i, j, a,n; int x, y; GrayImageMes Result; Result.ImageData = new BYTE*[source.Height]; result.BYImageData = new RGBQUAD*[source.Height]; for (int L = 0; L { result.BYImageData[L] = new RGBQUAD[source.Width]; Result.ImageData[L] = new BYTE[source.Width]; } CGrayscaleHood temp; temp.weighting_color_to_grayscale(source, Result); //转化为灰度 for (i = 1; i < source.Height - 1; i++) { for (j = 1; j < source.Width - 1; j++) { for (n = 0; n < 9; n++) { x = 1 - n / 3; y = 1 - n + (n / 3) * 3; a += Result.ImageData[i - x][j - y] * templt[n]; } a *= scale; a = a > 255 ? 255 : a; a = a < -255 ? -255 : a; switch (mode) { case 0:if (a < 0)a = 0; break; case 1:if (a > 0)a = 0; a=-a; break; case 2:if (a < 0)a = -a; break; case 3:a = 128 + a / 2; break; } result.BYImageData[i][j].rgbBlue = result.BYImageData[i][j].rgbGreen = result.BYImageData[i][j].rgbRed = a; } } result.Height = source.Height; result.Width = source.Width; delete Result.ImageData; }
    转载请注明原文地址: https://ju.6miu.com/read-27555.html

    最新回复(0)