1. 程式人生 > >影象處理--影象增強(二)

影象處理--影象增強(二)

1、對數影象增強演算法

      對數影象增強是影象增強的一種常見方法,其公式為: S = c log(r+1),其中c是常數(以下演算法c=255/(log(256)),這樣可以實現整個畫面的亮度增大。

void LogEnhance(IplImage* img, IplImage* dst)
{
	// 由於oldPixel:[1,256],則可以先儲存一個查詢表
	uchar lut[256] ={0};

	double temp = 255/log(256);

	for ( int i =0; i<255; i++)
	{
		lut[i] = (uchar)(temp* log(i+1)+0.5);
	}

	for( int row =0; row <img->height; row++)
	{
		uchar *data = (uchar*)img->imageData+ row* img->widthStep;
		uchar *dstData = (uchar*)dst->imageData+ row* dst->widthStep;

		for ( int col = 0; col<img->width; col++)
		{
			for( int k=0; k<img->nChannels; k++)
			{
				uchar t1 = data[col*img->nChannels+k];				
				dstData[col*img->nChannels+k] = lut[t1];
			}
		}		
	}	
}


2、指數影象增強演算法

      指數影象增強的表達為:S = cR^r,通過合理的選擇c和r可以壓縮灰度範圍,演算法以c=1.0/255.0, r=2實現。

void ExpEnhance(IplImage* img, IplImage* dst)
{
	// 由於oldPixel:[1,256],則可以先儲存一個查詢表
	uchar lut[256] ={0};

	double temp = 1.0/255.0;

	for ( int i =0; i<255; i++)
	{
		lut[i] = (uchar)(temp*i*i+0.5);
	}

	for( int row =0; row <img->height; row++)
	{
		uchar *data = (uchar*)img->imageData+ row* img->widthStep;
		uchar *dstData = (uchar*)dst->imageData+ row* dst->widthStep;

		for ( int col = 0; col<img->width; col++)
		{
			for( int k=0; k<img->nChannels; k++)
			{
				uchar t1 = data[col*img->nChannels+k];				
				dstData[col*img->nChannels+k] = lut[t1];
			}
		}		
	}	
}

3、加Masaic演算法

        在日常中有時候保密或其他需要將影象馬賽克,下面的演算法實現影象馬賽克功能(原理:用中心畫素來表示鄰域畫素)。

uchar getPixel( IplImage* img, int row, int col, int k)
{
	return ((uchar*)img->imageData + row* img->widthStep)[col*img->nChannels +k];
}

void setPixel( IplImage* img, int row, int col, int k, uchar val)
{
	((uchar*)img->imageData + row* img->widthStep)[col*img->nChannels +k] = val;
}
// nSize:為尺寸大小,奇數
// 將鄰域的值用中心畫素的值替換
void Masic(IplImage* img, IplImage* dst, int nSize)
{
	int offset = (nSize-1)/2;
	for ( int row = offset; row <img->height - offset; row= row+offset)
	{
		for( int col= offset; col<img->width - offset; col = col+offset)
		{
			int val0 = getPixel(img, row, col, 0);
			int val1 = getPixel(img, row, col, 1);
			int val2 = getPixel(img, row, col, 2);
			for ( int m= -offset; m<offset; m++)
			{
				for ( int n=-offset; n<offset; n++)
				{
					setPixel(dst, row+m, col+n, 0, val0);
					setPixel(dst, row+m, col+n, 1, val1);
					setPixel(dst, row+m, col+n, 2, val2);
				}
			}
		}
	}
}

4、曝光過度問題處理

      對於曝光過度問題,可以通過計算當前影象的反相(255-image),然後取當前影象和反相影象的較小者為當前畫素位置的值。

// 過度曝光原理:影象翻轉,然後求原圖與反圖的最小值
void ExporeOver(IplImage* img, IplImage* dst)
{
	for( int row =0; row <img->height; row++)
	{
		uchar *data = (uchar*)img->imageData+ row* img->widthStep;
		uchar *dstData = (uchar*)dst->imageData+ row* dst->widthStep;

		for ( int col = 0; col<img->width; col++)
		{
			for( int k=0; k<img->nChannels; k++)
			{
				uchar t1 = data[col*img->nChannels+k];
				uchar t2 = 255 - t1;
				dstData[col*img->nChannels+k] = min(t1,t2);
			}
		}		
	}
}

5、高反差保留

      高反差保留主要是將影象中顏色、明暗反差較大兩部分的交界處保留下來,比如影象中有一個人和一塊石頭,那麼石頭的輪廓線和人的輪廓線以及面部、服裝等有明顯線條的地方會變被保留,兒其他大面積無明顯明暗變化的地方則生成中灰色。其表達形式為:dst = r*(img - Blur(img))。

Mat HighPass(Mat img)
{
	Mat temp;
	GaussianBlur(img, temp,Size(7,7),1.6,1.6);

	int r=3;	
	Mat diff = img + r*(img-temp); //高反差保留演算法
	return diff;
}

測試程式碼:

int main(int argc, char* argv[])
{
	const char* Path = "E:\\22.bmp";
	IplImage *img = cvLoadImage(Path,CV_LOAD_IMAGE_ANYCOLOR);
	IplImage *dst = cvCreateImage(cvGetSize(img), img->depth, img->nChannels);

	cout<<"輸入你要選擇的操作:"<<endl;
	cout<<"1、曝光過度"<<endl;
	cout<<"2、加馬賽克"<<endl;
	cout<<"3、對數增強"<<endl;
	cout<<"4、指數增強"<<endl;
	cout<<"請輸入你的選擇:";

	int choice = 1;

	cin>>choice;
	switch (choice)
	{
	case 1: 
		ExporeOver(img, dst);   
		break;
	case 2: 
		Masic(img, dst, 21);
		break;
	case 3: 
		LogEnhance(img, dst);
		break;
	case 4:
		ExpEnhance(img, dst);
		break;
	default:
		cout<<"輸入錯誤"<<endl;
		break;			  
	}
	

	cvSaveImage("E:\\dst.jpg",dst);

	cvNamedWindow("SRC",1);
	cvNamedWindow("DST", 1);
	cvShowImage("SRC", img);
	cvShowImage("DST", dst);
	cvWaitKey();
	return 0;
}

相關推薦

影象處理--影象增強()

1、對數影象增強演算法       對數影象增強是影象增強的一種常見方法,其公式為: S = c log(r+1),其中c是常數(以下演算法c=255/(log(256)),這樣可以實現整個畫面的亮度增大。 void LogEnhance(IplImage* img, I

Java伺服器部署基於OpenCV的C++影象處理專案()編譯篇

Java伺服器部署基於OpenCV的C++影象處理專案(二)編譯篇 部署好環境之後,本篇記錄編譯的詳細步驟。部署環境篇 1.建立檔案 在native.cpp中寫入以下程式碼。 #include <jni.h> #include <string>

python+OpenCV影象處理(十)車牌定位中對影象的形態學組合操作處理

車牌定位中對影象的形態學組合操作處理 所謂的車牌定位,其中最關鍵的部分就是對圖片的處理,引數的設定,並使之擁有泛化能力。 首先傳入圖片,在進行大規模的圖片處理時,因為無法確定圖片的尺寸,所以需要將原始圖片進行等比例的縮放。 orgimg = cv2.imread('ch

【數字影象處理】作業 邊緣檢測與追蹤

作業二 邊緣檢測與追蹤 吳政億 151220129 [email protected] (南京大學 電腦科學與技術系, 南京 210093) 邊緣檢測 在邊緣檢測中,我使用了sobel,roberts,prewitt,marr作為運算元,對

數字影象處理筆記():使用OpenCV處理影象

1 - 傅立葉變換 傅立葉變換是影象處理的基礎,Joseph Fourier(約瑟夫 ⋅ \cdot ⋅

影象處理 空域增強

資源是可以掠奪的,要麼永遠縮在後面用那怯弱的目光看著別人在舞臺上光彩奪目,要麼咬著牙狠狠的提升自己的實力,在將來的某一天一鳴驚人,受萬眾矚目。——《全職法師》 前言 影象增強:改變影象畫素的灰度值,以改變影象灰度的動態範圍,增強影象的對比度。 增強的目的

數字影象處理—彩色增強—真彩色增強(從有彩色到有彩色)

在螢幕上顯示彩色圖一定要借用RGB模型,但HSI模型在許多處理中有其獨特的優點。 (1)在HSI模型中,亮度分量與色度分量是分開的。(和人視覺效果相聯絡) H:色調(Hue) S:飽和度(Saturation:構成色度分量。 I:密度(Intensity):構成亮度分量。

影象處理】VTK影象標記bug修正

遊戲或者CAD軟體中,我們常常在目標旁邊顯示一個始終面向使用者的二維影象,來表示某些特定標識。VTK使用vtkFollower 來實現這個功能,然而VTK7.1及以下版本發生bug,表現為使用vtkFollower之後,二維影象無法渲染,只顯示一個純白色的矩形框

基於matlab的數字影象處理--對比度增強

通過使用matlab將圖片的對比度提升。程式如下:% 通過灰度直方圖的資料顯示該影象的灰度值整體偏高,影象過於明亮, % 所以選用 γ > 1 的伽馬變換 % 降低影象的亮度,提升圖片的對比度。

海康威視攝像頭+OpenCV+VS2017 影象處理小結(

第二篇 先介紹海康威視SDK的配置; 接著介紹並提取OpenCV庫的標頭檔案以及庫檔案供工程使用,期間還演示瞭如何配置屬性表; 最後將海康威視的SDK進行封裝,封裝成HK_camera類,並在主函式中生成並呼叫這個類的例項

數字影象處理—彩色增強—偽彩色增強(亮度切割)(從灰度到彩色的變換)(頻域濾波)

一、偽彩色增強(從無彩色到有彩色): 一種常用的彩色增強方法是對原來灰度圖中不同灰度值的區域賦予不同的顏色以更明顯地區分它們。 二、主要有三種根據影象灰度的特點而賦予偽彩色的方法: 1、亮度切割:將影象灰度分級,然後對每個灰度值區間內的畫素賦一種顏色。 2、從灰度到彩色的變

(Opencv C++)數字影象處理——空域增強

我們將從以下三個方面來實現空域增強: 一、圖象灰度變換; 二、圖象平滑; 三、圖象銳化;   一、圖象灰度變換; (1)、顯示直方圖; (2)、對灰度影象進行直方圖均衡化; (3)、對灰度影象進行直方圖拉伸; 主要用到的庫函式如下: void cal

ZYNQ HLS影象處理加速總結()——Processing System軟體部分

概述 7010的硬核是兩個Cortex-A9,主頻666M(233333….),硬浮點+neon協處理器,效能不是很好,因為xilinx SDK可以生成底層IP的driver,所以PS裸跑起來很簡單,通過JTAG除錯很方便。初期時考慮到跑linux系統時的HL

影象處理(十影象融合(1)Seamless cloning泊松克隆-Siggraph 2004

Seamless cloning泊松克隆 作者:hjimce 本篇博文主要講解2004年Siggraph的經典paper:《Poisson Image Editing》,在影象融合領域,融合效果最牛逼的paper。講這個演算法,我沒打算講太多理論的公式,理論的東西,對於大

影象處理Matlab()——生成隨機點

figure; set(gcf,'Position',[400,300,200,200]); a1 = 40; set(axes,'Color',[128/255 128/255 128/255]); hold on C = randi([-100,100],a1,1);   % 隨機生成整數型函式 C1 =

數字影象處理--影象增強MATLAB程式

影象增強是增強影象中的有用資訊,它可以是一個失真的過程,其目的是要改善影象的視覺效果,針對給定影象的應用場合。有目的地強調影象的整體或區域性特性,將原來不清晰的影象變得清晰或強調某些感興趣的特徵,擴大影象中不同物體特徵之間的差別,抑制不感興趣的特徵,使之改善影象質量、豐富資訊

Win8 Metro(C#)數字影象處理--2.40影象輪廓提取演算法

 [函式名稱] 二值影象輪廓提取 ContourExtraction(WriteableBitmap src) [演算法說明]   二值影象的輪廓提取對於影象識別,影象分割有著重要意義。該演算法的核心就是將影象目標的內部點消除。所謂內部點,我們要根據當前畫素點的鄰域來進

【OpenCV3影象處理】查詢影象的邊緣 ( findContours()函式詳解 )

void cv::findContours ( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode

深入學習影象處理——影象相似度演算法

  最近一段時間學習並做的都是對影象進行處理,其實自己也是新手,各種嘗試,所以我這個門外漢想總結一下自己學習的東西,影象處理的流程。但是動起筆來想總結,一下卻不知道自己要寫什麼,那就把自己做過的相似圖片搜尋的流程整理一下,想到什麼說什麼吧。   首先在進行圖片灰度化處理之前,我覺得有必要了解一下

數字影象處理——影象分割

基本全域性閾值演算法: 1.設定初始灰度值T,可設為影象的平均灰度值 2.用T把影象分成兩部分G1和G2,G1的灰度值大於T,G2的灰度值小於等於T 3.計算G1,G2的平均灰度值m1,m2 4.更新T=(m1+m2)/2 5.重複2~4直到T的變化量小於某個很小的閾值 Ma