/*------------------------------------------------------------------------
*
* Copyright (c) 1997-1998 by Cornell University.
*
* See the file "license.txt" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* Steve Weiss sweiss@cs.cornell.edu
*
* Usage : canny inputPGM outputPBM
* Dimension if inputPGM must be multiples of 8.
*
* Performs Canny edge detection on the input image.
*------------------------------------------------------------------------
*/
#include <dvmbasic.h>
#include <dvmpnm.h>
#include <dvmvision.h>
void ReadPGM(char *, PnmHdr **, ByteImage **);
void WritePBM8(PnmHdr *, BitImage *, char *);
int main(int argc, char *argv[])
{
PnmHdr *hdr;
ByteImage *buf, *smth;
BitImage *bit1;
int w, h;
/*
* Check the arguments.
*/
if (argc != 3) {
fprintf(stderr, "usage : %s input output\n", argv[0]);
exit(1);
}
/*
* Read the input image.
*/
ReadPGM (argv[1], &hdr, &buf);
w = PnmHdrGetWidth (hdr);
h = PnmHdrGetHeight (hdr);
/*
* First, smooth the input image.
*/
smth = ByteNew(w, h);
ByteSmooth(buf, smth, 2);
/*
* Perform Canny edge detection.
*/
ByteEdgeDetectCanny(smth, buf, 5, 10);
ByteFree(smth);
/*
* Convert the edge detected image into a B&W bit image, and output it.
*/
bit1 = BitNew(w, h);
BitMakeFromThreshold8(buf, bit1, 128, 0);
WritePBM8(hdr, bit1, argv[2]);
BitFree(bit1);
return 0;
}