击中-击不中变换(约束)—lhMorpHMTC
?所采用的9*1 自定義結構為:
?
函數:lhMorpHMTC
說明:形態學約束擊中-擊不中變換,當為二值圖像時,結果與lhMorpHMTB相同。
參數:
src 輸入圖像,灰度或二值圖像
dst 輸出圖像
sefg 前景結構元素
sebg 背景結構元素,如為空,則默認為前景結構元素sefg的取反
源碼:
void lhMorpHMTC(const IplImage* src, IplImage* dst, IplConvKernel* sefg, IplConvKernel* sebg =NULL)
{
?????? assert(src != NULL && dst != NULL && src != dst && sefg!= NULL && sefg!=sebg);
?????? if (sebg == NULL)
????????????? sebg = lhStructuringElementNot(sefg);
?????? IplImage*? temp1 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? temp2 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? temp3 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? temp4 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? mask1 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? mask2 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? mask3 = cvCreateImage(cvGetSize(src), 8, 1);
?????? IplImage*? mask4 = cvCreateImage(cvGetSize(src), 8, 1);
?????? cvZero(mask1);
?????? cvZero(mask2);
?????? cvZero(mask3);
?????? cvZero(mask4);
?????? cvZero(dst);
?????? cvErode( src, temp1, sebg);
?????? cvDilate( src, temp2, sebg);
?????? cvErode( src, temp3, sefg);
?????? cvDilate( src, temp4, sefg);
?????? cvCmp(src, temp3, mask1, CV_CMP_EQ);
?????? cvCmp(temp2, src,? mask2, CV_CMP_LT);
?????? cvAnd(mask1, mask2, mask2);
?????? cvCmp(src, temp4, mask3 , CV_CMP_EQ);
?????? cvCmp(temp1, src, mask4 , CV_CMP_GT);
?????? cvAnd(mask3, mask4, mask4);
?????? cvSub(src, temp2, dst, mask2);
?????? cvSub(temp1, src, dst, mask4);
?????? cvReleaseImage(&mask1);
?????? cvReleaseImage(&mask2);
?????? cvReleaseImage(&mask3);
?????? cvReleaseImage(&mask4);
?????? cvReleaseImage(&temp1);
?????? cvReleaseImage(&temp2);
?????? cvReleaseImage(&temp3);
?????? cvReleaseImage(&temp4);
?????? cvReleaseStructuringElement(&sebg);
}
總結
以上是生活随笔為你收集整理的击中-击不中变换(约束)—lhMorpHMTC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用C#的HttpWebRequest模
- 下一篇: vim括号操作(转)