80 likes | 233 Views
Programovanie modulov na číslicové spracovanie obrazu. programy na spracovanie obrazu: MAC: NIH Image (ftp://zippy.nimh.nih.gov/pub) PC: ImagePC (http://www.scioncorp.com) PC: ImageTool ( http://ddsdx.uthscsa.edu ) MAC+PC: Fovea Pro, Photoshop Plug-ins IPTK (http://reindeergraphics.com)
E N D
Programovanie modulov na číslicové spracovanie obrazu • programy na spracovanie obrazu: • MAC: NIH Image (ftp://zippy.nimh.nih.gov/pub) • PC: ImagePC (http://www.scioncorp.com) • PC: ImageTool (http://ddsdx.uthscsa.edu) • MAC+PC: Fovea Pro, Photoshop Plug-ins IPTK (http://reindeergraphics.com) • rozpor univerzalita - jednoduchost • príkazy z menu a z klavesnice • script jazyk • programovanie plug-in modulov • Výhody plug-in modulov • menej práce, rôzne formáty vstupu a výstupu • stabilnejšie prostredie • kluby užívateľov - výmena poznatkov, zdroje • komerčné možnosti (zachovanie autorstva modulov)
Adobe Photoshop Plug-ins • "klasický" formát Plug-in modulov zaviedol Photoshop (partners.adobe.com) • Typu modulov: Acquisition, Filter, ... • Modulu sa pri volaní odovzdá blok parametrov: Filter parameter block, ktorý obsahuje: • serialNumber • abortProc, progressProc, bufferProcs, handleProcs, resourceProcs, processEvent • imageSize, planes, imageMode • filterRect, inRect, outRect, maskRect • maxSpace, bufferSpace • inData, outData, maskData • inRowBytes, outRowBytes, maskRowBytes • isFloating, haveMask, autoMask • maskRect, maskData, maskRowBytes • maxSpace, bufferSpace • isFloating, haveMask, autoMask • imageHRes, imageVRes
ELLIPSE • Easy to Learn Laboratory Image Processing System and Editor • Visual C++ V 6.0, triedy, objekty Pracuje za podpory nasledovných DLL: • FreeImage (externa "free" knižnica na podporu načítavania obrazov v 28 rôznych formatoch. • elGraph (obsahuje grafické objekty, ktoré sú používané jednak Ellipse a tiež Plugin modulmi) • CLine, CMultilineLine, CAngle, CPolygon • Trackerytýchto tried napr. CPolygonTracker má fcie Track, TrackFreeHand • CFit - prekladanie kriviek (priamka, 4 typy polynómov, exponencial, logaritm, mocnina) • CLevel - na podporu stackov t.j. série obrazov (napr. 3D rezy telesom), slider na ovládanie, vzájomné 3D väzby • CResultTable tabulka na uchovávanie výsledkov výpočtov. Obsahuje a)Hlavičku, b)Data, c)Masku • CHelper - obsahuje rôzne funkcie, ktoré nepatria do žiadnej z predošlých tried
Štruktúra DIB BITMAPFILEHEADER bfType = "BM" bfOffBits = ukazovateľ na pole obrazových dat BITMAPINFOHEADER{ biSize; // veľkosť tejto štruktúry biWidth; //šírka v pixeloch biHeight; // výška v pixeloch biPlanes; // =1 biBitCount // 1, 4, 8, 16, 24 alerbo 32 biCompression; // ak je použitá biClrUsed; // nenulove pre krátke tabuľky PALETTE 2 záznamy pre jednofarebné DIBy 16 alebo menej záznamov pre 4bpp DIBy 256 alebo menej záznamov pre 8bpp DIBy (záznam ma 32 bitov - napr. 0x00FF88FF) BITY OBRÁZKU DIB Pixely sú zarovnané podľa bitov v riadku Riadky sú doplnené na 4-bajtové hranice long nAw = ((nWidth + 3) / 4) * 4;
Trieda CDib (skrátené) class AFX_EXT_CLASS CDib : public CObject{ public: LPVOID m_lpvColorTable; HBITMAP m_hBitmap; LPBYTE m_lpImage; // starting address of DIB bits LPBITMAPINFOHEADER m_lpBMIH; private: DWORD m_dwSizeImage; // of bits -- not int m_nColorTableEntries; public: CDib(); CDib(CSize size, int nBitCount); CDib::CDib(const CDib &dib); ~CDib(); int GetSizeHeader() {return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;} CSize GetDimensions(); BOOL Read(CFile* pFile); BOOL Write(CFile* pFile); int GetPixel(CPoint lp, long& color); };
Plug-in: transformácia obr. void CDlg::OnDlgApply() { // funkcia, ktora transformuje ImBitsSrc na ImBitsDest UpdateData(true); BYTE* ImBitsDst = m_pDib->m_lpImage; BYTE* ImBitsSrc = m_pDoc->m_MyDib->m_lpImage; int nWidth = m_pDib->GetDimensions().cx; int nHeight = m_pDib->GetDimensions().cy; long nAw = ((nWidth + 3) / 4) * 4; for(int row = 0; row < nHeight; row++){ for(int col = 0; col < nWidth; col++) { int nTmp=ImBitsSrc[(nHeight-1-row)*nAw+col]-m_nVal; if(nTmp >= 0) ImBitsDst[(nHeight - 1 - row) * nAw + col] = nTmp; else ImBitsDst[(nHeight - 1 - row) * nAw + col] = m_nMode ? 255 + nTmp : 0; } //for col } // for row Invalidate(false); }
Plug-in: kliknutie na obrázok // zapamätá si bod obrázku, na ktorý bolo kliknuté void CImage::OnLButtonDown(UINT, CPoint point) { CView* pView = m_pDlg->GetImageView(); CClientDC dc(pView); pView->OnPrepareDC(&dc); CPoint ptOld = m_pDlg->m_pt; m_pDlg->m_pt = point; dc.DPtoLP(&m_pDlg->m_pt); int r = m_pDlg->m_cnR + 1; CRect rectRefreshOld(ptOld.x - r, ptOld.y - r, ptOld.x + r, ptOld.y + r); pView->InvalidateRect(&rectRefreshOld); CRect rectRefreshNew(m_pDlg->m_pt.x - r, m_pDlg->m_pt.y - r, m_pDlg->m_pt.x + r, m_pDlg->m_pt.y + r); pView->InvalidateRect(&rectRefreshNew); CDialog::OnLButtonDown(nFlags, point); }
Plug-in: kreslenie do obrázku • Modul má vlastný podprogram, ktorým pridá svoju kresbu k "overlay" kresbám na obrázku. // nakreslí krížik na miesto, kde bolo kliknuté void CDlg::AddPluginDraw(LPARAM lParam) { CDC* pDC = (CDC*)lParam; CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); CPen* pOldpen = pDC->SelectObject(&pen); if(m_pt != CPoint(0, 0)) { pDC->MoveTo(m_pt - CSize(m_cnR, 0)); pDC->LineTo(m_pt + CSize(m_cnR + 1, 0)); pDC->MoveTo(m_pt - CSize(0, m_cnR)); pDC->LineTo(m_pt + CSize(0, m_cnR + 1)); } pDC->SelectObject(pOldpen); }