Перейти к содержимому
Compvision.ru

nagoHok

Пользователи
  • Количество публикаций

    54
  • Зарегистрирован

  • Посещение

  • Days Won

    1

Сообщения, опубликованные пользователем nagoHok


  1. Добавил сглаживание, не скажу что уж очень сгладилось но больших пиков уже нет

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    
    {
    
    	cvNamedWindow("Org");
    
    	cvNamedWindow("Gray");
    
    	IplImage* frame = NULL;	
    
    
    	frame = cvLoadImage("c:/test.jpg");
    
    
    	IplImage* gray = NULL;
    
    
    	gray = cvCreateImage(cvGetSize(frame), 8, 1);
    
    
    	cvConvertImage(frame, gray, CV_BGR2GRAY);
    
    
    
    
    	CvPoint ptLast = cvPoint(0, 0);
    
    
    	DWORD dwStart = GetTickCount();
    
    	int nLastYPos = 0;
    
    
    
    	for (int nY = 0; nY < gray->height; nY+=10)
    
    	{
    
    		ptLast = cvPoint(0, nY);
    
    		for (int nX = 2; nX < gray->widthStep - 2; nX++)
    
    		{
    
    			int nAv = 0;
    
    			for (int nPos = -2; nPos < 3; nPos++)
    
    			{
    
    				nAv += gray->imageData[nY * gray->widthStep + nX + nPos];
    
    			}	
    
    			nAv = abs(nAv);
    
    			nAv /= 50;
    
    			//int nBr1 =  gray->imageData[nY * gray->widthStep + nX + 1] / 10;
    
    			//nBr = abs(nBr1 - nBr);
    
    			cvLine(frame, ptLast, cvPoint(nX, nY - nAv) , cvScalar(0), 1);
    
    			ptLast = cvPoint(nX, nY - nAv);
    
    		}
    
    	}
    
    
    	dwStart = GetTickCount() - dwStart;
    
    
    	std::cout << dwStart;
    
    
    
    	cvShowImage("Gray", gray);
    
    	cvShowImage("Org", frame);
    
    
    	cvReleaseImage(&gray);
    
    	cvReleaseImage(&frame);
    
    
    	gray = NULL;
    
    	frame = NULL;
    
    
    	char c = cvWaitKey(0);
    
    	if (c == 27) 
    
    	{ 
    
    		return 0;
    
    	}
    
    	return 0;
    
    }

    post-1451-0-53395400-1310559346_thumb.jp


  2. Итак перерыв форум, наткнулся на ссылочку http://www.inf.tsu.ru/library/DiplomaWorks/CompScience/2006/busigin/diplom.pdf

    Очень понравился алгоритм про сканирование изображения в горизонтальном сечении и построения графика амплитуды яркости от координат.

    Единственное на чем встал это на предложеной функции в разделе 3,3 на 21 странице, ни как не получается получить похожий график, к томуже далее предлагается получить производные от этой функции, но так как вуз мною закончен более 10 лет назад, вся основа вышки благополучно забыта.

    Если кто силен в математике, подскажите что делать.

    Спасибо за рание.

    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    
    {
    
    	cvNamedWindow("Org");
    
    	cvNamedWindow("Gray");
    
    	IplImage* frame = NULL;
    
    	frame = cvLoadImage("c:/O807MK177.jpg");
    
    
    	IplImage* gray = NULL;
    
    
    	gray = cvCreateImage(cvGetSize(frame), 8, 1);
    
    
    	cvConvertImage(frame, gray, CV_BGR2GRAY);
    
    
    
    
    	CvPoint ptLast = cvPoint(0, 0);
    
    
    	DWORD dwStart = GetTickCount();
    
    	int nLastYPos = 0;
    
    
    
    	for (int nY = 0; nY < gray->height; nY+=10)
    
    	{
    
    		ptLast = cvPoint(0, nY);
    
    		for (int nX = 0; nX < gray->widthStep - 2; nX++)
    
    		{
    
    			int nBr =  gray->imageData[nY * gray->widthStep + nX] / 10;
    
    			int nBr1 =  gray->imageData[nY * gray->widthStep + nX + 1] / 10;
    
    
    			nBr = abs(nBr1 - nBr);
    
    			cvLine(frame, ptLast, cvPoint(nX, nY - nBr) , cvScalar(0), 1);
    
    			ptLast = cvPoint(nX, nY - nBr);
    
    		}
    
    	}
    
    
    	dwStart = GetTickCount() - dwStart;
    
    
    	std::cout << dwStart;
    
    
    
    	cvShowImage("Gray", gray);
    
    	cvShowImage("Org", frame);
    
    
    	cvReleaseImage(&gray);
    
    	cvReleaseImage(&frame);
    
    
    	gray = NULL;
    
    	frame = NULL;
    
    
    	char c = cvWaitKey(0);
    
    	if (c == 27) 
    
    	{ 
    
    		return 0;
    
    	}
    
    	return 0;
    
    }
    
    


  3. Здесь похоже имеется ввиду, что обработка этим фильтром = лаплассиан изображения + само изображение. Фильтр не должен выдавать значения больше диапазона значений изображения, т.к. сумма элементов матрицы равна 0.999. Так что изображение будет на 0.1% темнее исходного.

    т.е. суммировать свернутое и исходное изображение всетаки надо?


  4. 1. Ммм, а зачем суммировать?

    2. Почему размер ядра фильтра (double arKernel[25]) 25, а не 9?

    Опа, действительно мой косяк на счет размерности.

    Просто понял фразу

    Фильтрация лапласианом и сложение с исходным эквивалентно фильтрации фильтром:

    0.1111 -0.8889 0.1111

    -0.8889 4.1111 -0.8889

    0.1111 -0.8889 0.1111

    Всё, что выходит за пределы диапазона, обрезается.

    то что надо просуммировать исходное изображение с фильтрованным.

    Т.е. наложить данный фильтр это и есть увеличение резкости или же как говорит Smorodov не все так просто в этом вопросе?


  5. Здесь посмотри пост f.kirill, примеры работы, приводимого им фильтра.

    я правильно понимаю что сначало мы делаем свертку с маской

    0.1111 -0.8889 0.1111

    -0.8889 4.1111 -0.8889

    0.1111 -0.8889 0.1111

    затем полученный результат суммируем с исходным изображением?

    double arKernel[25] = {0.1111, -0.8889, 0.1111, -0.8889, 4.1111, -0.8889, 0.1111, -0.8889, 0.1111};
    
    CvMat mat = cvMat(3, 3, CV_8UC1, arKernel);
    
    cvFilter2D(src, dst, &mat, cvPoint(-1,-1));
    
    cvAdd(src, dst, dst);


  6. Очень заинтересовался проектом, точнее вплотную принялся за подобную разработку.

    Код выложенный anton - м действительно очень тормозной, и не всегда коректно находит прямоугольники. Утечка памяти изза того что не чистит MemStorage.

    Перерыл море инфы на ткнулся вот на подобный алгоритм http://cms.tusur.ru/filearchive/reports-magazine/2008-2-1/34-39.pdf

    заключается он в разбиение изображения на блоки и составления карты контрастности

    Кто что может сказать про данный метод?


  7. кто может описать процесс установки для 2008 студии?

    Если кто ставил будьте добры, а то реально самому разбираться времени просто нету(

    Благодарю за рание!


  8. Может кому то и пригодиться

    
    __forceinline int GetBit(const BYTE &btByte, const UINT &nBit)
    
    {
    
    	BYTE btMask = 1 << nBit;
    
    	BYTE btR = btMask & btByte;
    
    	if(btR)
    
    		return 1;
    
    	return 0;
    
    }
    
    
    IplImage* LoadImage(const CString& strPathName)
    
    {
    
    	Bitmap* pBitmap = NULL;
    
    	IplImage* pImage = NULL;
    
    
    	pBitmap = new Bitmap(strPathName);
    
    	if(!pBitmap)
    
    		return NULL;
    
    	if(pBitmap->GetLastStatus() != Ok)
    
    	{
    
    		delete pBitmap;
    
    		return NULL;
    
    	}
    
    	if(pBitmap->GetPixelFormat() != PixelFormat1bppIndexed)
    
    	{
    
    		delete pBitmap;
    
    		CStringA strPathNameA(strPathName);
    
    		pImage = cvLoadImage(strPathNameA);
    
    		return pImage;
    
    	}
    
    
    	BitmapData *pSrcData = new BitmapData;
    
    	SecureZeroMemory(pSrcData, sizeof(BitmapData));
    
    	if(pBitmap->LockBits(&Rect(0,0, pBitmap->GetWidth(), pBitmap->GetHeight()), ImageLockModeRead , pBitmap->GetPixelFormat(), pSrcData) != Ok)
    
    	{
    
    		delete pBitmap;
    
    		delete pSrcData;
    
    		return NULL;
    
    	}
    
    
    	pImage = cvCreateImage(cvSize(pSrcData->Width, pSrcData->Height), IPL_DEPTH_8U, 1);
    
    	if(!pImage)
    
    	{
    
    		delete pBitmap;
    
    		delete pSrcData;
    
    		return NULL;
    
    	}
    
    
    	int nSize = 0;
    
    	int nStride = abs(pSrcData->Stride);
    
    
    	BYTE* pSrcPixels = (BYTE*)pSrcData->Scan0;
    
    
    
    	for (UINT nY = 0; nY < pSrcData->Height; nY++)
    
    	{
    
    		int nOffset = 0;
    
    		for (int nX = 0; nX < nStride; nX++)
    
    		{				
    
    			BYTE bt8Bit = pSrcPixels[nX + nY * nStride];
    
    			for (int nBit = 7; nBit > -1; nBit--)
    
    			{
    
    				nSize = nX + nY * pImage->widthStep + nOffset;
    
    				if(nSize > pImage->imageSize)
    
    					break;
    
    				int nBW = 0;
    
    				if(GetBit(bt8Bit, nBit))
    
    					nBW = 255;								
    
    				pImage->imageData[nSize] = nBW;
    
    
    				nOffset++;
    
    			}
    
    			nOffset--;
    
    		}
    
    	}
    
    	delete pBitmap;
    
    	delete pSrcData;
    
    	return pImage;
    
    }
    
    

×