天天看點

OpenCV圖像增強算子

http://www.ihalcon.com/read-12670.html
#include
#include  //頭檔案
using namespace cv; //包含cv命名空間
using namespace std;
int main()
{
 
//讀入圖檔
Mat img_1 = imread("F:\\圖示\\222222.jpg");
//Mat img_2 = imread("F:\\圖示\\2.jpg");
if (img_1.empty())
{
cout << "打開圖檔失敗,請檢查" << endl;
return -1;
}
imshow("src_img", img_1);
 
//圖像增強算法  直方圖均衡化-------------------------------------------------------------------1
Mat imageRGB[3];
split(img_1, imageRGB);
for (int i = 0; i < 3; i++)
{
equalizeHist(imageRGB, imageRGB);
}
merge(imageRGB, 3, img_1);
imshow("直方圖均衡化圖像增強效果", img_1);
 
//拉普拉斯算子可以增強局部的圖像對比度---------------------------------------------------------2
Mat imageEnhance;
Mat kernel = (Mat_(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
filter2D(img_1, imageEnhance, CV_8UC3, kernel);//利用核心實作對圖像的卷積運算
imshow("拉普拉斯算子圖像增強效果", imageEnhance);
 
//基于對數Log變換的圖像增強,達到了擴充和增強低灰階部分,壓縮高灰階部分的值的功能-------------3
Mat imageLog(img_1.size(), CV_32FC3);
for (int i = 0; i < img_1.rows; i++)
{
for (int j = 0; j < img_1.cols; j++)
{
imageLog.at(i, j)[0] = log(1 + img_1.at(i, j)[0]);
imageLog.at(i, j)[1] = log(1 + img_1.at(i, j)[1]);
imageLog.at(i, j)[2] = log(1 + img_1.at(i, j)[2]);
}
}
 
//歸一化到0~255    
normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
//轉換成8bit圖像顯示    
convertScaleAbs(imageLog, imageLog);
imshow("after", imageLog);
 
//基于伽馬變換的圖像增強,---------------------------------------------------------------------4
//伽馬變換對于圖像對比度偏低,并且整體亮度值偏高(對于于相機過曝)情況下的圖像增強效果明顯。
Mat imageGamma(img_1.size(), CV_32FC3);
for (int i = 0; i < img_1.rows; i++)
{
for (int j = 0; j < img_1.cols; j++)
{
imageGamma.at(i, j)[0] = (img_1.at(i, j)[0])*(img_1.at(i, j)[0])*(img_1.at(i, j)[0]);
imageGamma.at(i, j)[1] = (img_1.at(i, j)[1])*(img_1.at(i, j)[1])*(img_1.at(i, j)[1]);
imageGamma.at(i, j)[2] = (img_1.at(i, j)[2])*(img_1.at(i, j)[2])*(img_1.at(i, j)[2]);
}
}
 
//歸一化到0~255    
normalize(imageGamma, imageGamma, 0, 255, CV_MINMAX);
//轉換成8bit圖像顯示    
convertScaleAbs(imageGamma, imageGamma);
imshow("伽馬變換圖像增強效果", imageGamma);
 
//imshow("【圖2】", img_2);
cout << "圖像1的長寬:" << img_1.rows <<"*"<< img_1.cols << endl;
//cout << "圖像2的長寬:" << img_2.rows <<"*"<< img_2.cols << endl;
 
//轉為灰階圖并去燥
Mat gray_img;
cvtColor(imageGamma, gray_img, CV_RGB2GRAY);
blur(gray_img,gray_img,Size(5,5));
 
//canny邊緣檢測
Mat canny_img;
Canny(gray_img,canny_img,10.0,60.0);
 
vector compression_params;
//向compression_params裡面添加值
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
imwrite("F:\\圖示\\222222增強.jpg", imageGamma, compression_params);
imwrite("F:\\圖示\\222222素描.jpg", canny_img, compression_params);
cout << "素描圖像儲存成功!"<<endl; 
cout << "增強圖像儲存成功!"<<endl;
imshow("gray_image", gray_img);
imshow("canny_img", canny_img);
waitkey(0);
return 0;
}

      

繼續閱讀