/*------------------------------------------------------------------------
*
* 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.
*
* sobel.c
*
* Steve Weiss sweiss@cs.cornell.edu
*
* Performs Sobel edge detection on the input image. The input image's
* dimensions must be multiple of 8.
*
*------------------------------------------------------------------------
*/
#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;
ByteImage *smth, *e1, *e2;
BitImage *bit1, *bit2, *edge;
int w, h, t1, t2;
if (argc != 3) {
fprintf(stderr, "usage : %s input output\n", argv[0]);
exit(1);
}
ReadPGM (argv[1], &hdr, &buf);
w = PnmHdrGetWidth (hdr);
h = PnmHdrGetHeight (hdr);
e1 = ByteNew(w, h);
e2 = ByteNew(w, h);
edge = BitNew(w, h);
bit1 = BitNew(w, h);
bit2 = BitNew(w, h);
smth = ByteNew(w, h);
/*
* We smooth the image, perform edge detection. We will get two
* bit images corresponding to the vertical and horizontal edge
* respectively. We then union these two to get the final edge
* image.
*/
ByteSmooth(buf, smth, 2);
ByteEdgeDetectSobel(smth, e1, e2, 90, &t1, &t2);
BitMakeFromThreshold8(e1, bit1, t1, 0);
BitMakeFromThreshold8(e2, bit2, t2, 0);
BitUnion8(bit1, bit2, edge);
WritePBM8(hdr, edge, argv[2]);
ByteFree(buf);
ByteFree(smth);
BitFree(e1);
BitFree(e2);
BitFree(edge);
BitFree(bit1);
BitFree(bit2);
return 0;
}