- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello All,
I am working on Canny Edge Detection. I need to determine the high and the low thresholds automatically. I was planning to use median value auto-thresholding. I am trying to find the histogram of the image, sort histogram index by value and take the median value.
In my below code, I calculate the median without sorting the histogram. I tried using the IPP sort functions but that seems to not work for my problem. How do I go about sorting the histogram index by value so that while calculating the median, I get the correct index value ?
Kindly please help me solve this issue.
Note: I use templates for the image functions (histogrameven, sobel, canny) just for clarification.
#define GrayLevels 256
int main()
{
std::string path("C:\\Images\\Edge\\");
std::string inputImageFile = path + "lena_gray.bmp";
IppImage<Ipp8u,1> imgsrc;
ippiLoadBMP(inputImageFile.c_str(),imgsrc);
IppImage<Ipp8u,1> imgDst(imgsrc.Size());
IppImage<Ipp8u,1> dx(imgsrc.Size());
IppImage<Ipp8u,1> dy(imgsrc.Size());
Ipp32s imHist[GrayLevels];
Ipp32s imLevels[GrayLevels+1];
int scaleFactor = 1.2;
Ipp32f high;
Ipp32f low;
int i;
IppiSize imgSize;
int w = imgsrc.Width();
int h = imgsrc.Height();
IppStatus status;
imgSize.width = w;
imgSize.height = h;
Ipp32s cumSum;
cumSum = 0;
IppImage<Ipp8u,1> imgDst1(w,h);
status = ippiHistogramEven(imgsrc, imgSize, imHist, imLevels, GrayLevels+1, 0, GrayLevels);
status = ippiSobelFilterNegVertBorder(imgsrc, dx, imgSize, ippMskSize3x3, ippBorderRepl, 0);
status = ippiSobelFilterHorizBorder(imgsrc, dy, imgSize, ippMskSize3x3, ippBorderRepl, 0);
//Calculating the high and the low thresholds
for (i = 0; i < GrayLevels; i++)
{
cumSum += imHist;
if (cumSum >= (Ipp32s)(0.5 * w * h))
{
high = i;
low = 0.5 * high;
break;
}
}
imgDst.ResizeNE(w,h);
status = ippiCanny(dx, dy, imgDst, imgSize, low, high);
status = ippiAddSfs(imgsrc, imgDst, imgDst1, scaleFactor);
std::string out4f = path + "lena_gray_detected.bmp";
imgDst.ResizeNE(imgsrc.Width(),imgsrc.Height());
imgDst.ResizeNE(w,h);
ippiSaveBMP(out4f.c_str(),imgDst);
return(EXIT_SUCCESS);
}
Thanks,
Sharath
Link Copied
0 Replies
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page