掌握 Opencv 进行图像处理的基础,实现图像的灰度变换处理。
1、掌握 OpenCV 的安装
2、掌握 OpenCV 对图像进行基本操作
3、掌握利用 OpenCV 对图像进行灰度变换
1、利用 OpenCV 读取图像。
具体内容:用打开 OpenCV 打开图像,并在窗口中显示
2、灰度图像二值化处理
具体内容:设置并调整阈值对图像进行二值化处理。
3、灰度图像的对数变换
具体内容:设置并调整 r 值对图像进行对数变换。
4、灰度图像的伽马变换
具体内容:设置并调整γ值对图像进行伽马变换。
5、彩色图像的补色变换
具体内容:对彩色图像进行补色变换。
#include "main.hpp"
#include
using namespace cv;
int main(int argc, char** argv) {
Mat image;
//加载图片
image = imread("/Users/Admin/Desktop/myProject/1.jpg", 1);
//创建窗口
namedWindow("Display Image", WINDOW_AUTOSIZE);
//显示图像
imshow("Display Image", image);
//暂停,等待按键结束
waitKey(0);
return 0;
}
首先要先将图片处理为灰度图像:
//处理为灰度图像
void grayShow(Mat &image){
Mat gray;
cvtColor(image, gray, COLOR_RGBA2GRAY);
namedWindow("gray picture");
imshow("gray picture", gray);
Threshold(gray);
//logTransfer(gray);
//gammaTranfer(gray);
}
之后开始进行二值处理:
//二值化变换
void Threshold(Mat &gray){
Mat result;
threshold(gray, result, 120,255,THRESH_BINARY);
namedWindow("binary picture");
imshow("binary picture", result);
}
对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强。
对灰度图像进行变换
代码实现:
//对数变换
void logTransfer(Mat &gray){
Mat srcImage(gray);
Mat dstImage(srcImage.size(),srcImage.type());
//计算1+r
add(gray, Scalar(1.0), srcImage);
//转换为浮点数
srcImage.convertTo(srcImage, CV_64F);
//计算log(1+r) log:第一个参数为输入图像,第二个参数为得到的对数值
log(srcImage,dstImage);
//这里设c=1
dstImage=1*dstImage;
//归一化处理
normalize(dstImage,dstImage,0,255,NORM_MINMAX);
convertScaleAbs(dstImage, dstImage);
imshow("dstpicture", dstImage);
}
normalize()函数:
- src 输入数组
- dst 输出数组,支持原地运算
- range normalization模式的最小值
- range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
- normType归一化的类型,可以有以下的取值:
– NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
–NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)
–NORM_L1 : 归一化数组的L1-范数(绝对值的和)
–NORM_L2: 归一化数组的(欧几里德)L2-范数
它是对输入图像的灰度值进行指数变换,进而校正亮度上的偏差。其中c和 γ为正常数.,伽马变换的效果与对数变换有点类似,当 γ >1时将较窄范围的低灰度值映射为较宽范围的灰度值,同时将较宽范围的高灰度值映射为较窄范围的灰度值;当 γ <1时,情况相反,与反对数变换类似。
代码实现:
//伽马变换
//gamma值,随着值不同图片呈现出不同的效果
void gammaTranfer(Mat &gray){
//gamma值,随着值不同图片呈现出不同的效果
double gamma=0.5;
Mat grayImg;
gray.convertTo(grayImg, CV_64F,1.0/255,0);
Mat gammaImg;
pow(grayImg, gamma,gammaImg);
gammaImg.convertTo(gammaImg, CV_8U,255,0);
imshow("gammapicture", gammaImg);
}
当gamma<1时,取gamma=0.5,对暗部份增强
当gamma>1时,取gamma=2.5,对高亮部分增强
彩色环上,与色调直接相对的另一边称为补色。
实现代码:
运用两种方法实现,一种是HSV
一种是RGB
//彩色图像变换
void colorTransfer(Mat &image){
Mat colorpicture;
image.copyTo(colorpicture);
//HSV
Mat hsvImg;
cvtColor(image,hsvImg, COLOR_BGR2HSV);
std::vector<Mat> hsv;
split(hsvImg, hsv);
hsv[0]=(Scalar::all(180)-hsv[0]);
merge(hsv, colorpicture);
imshow("补色HSV", colorpicture);
//RGB
colorpicture=Scalar::all(255)-image;
imshow("RBGbuse", colorpicture);
}
#include "main.hpp"
#include
using namespace cv;
//二值化变换
void Threshold(Mat &gray){
Mat result;
threshold(gray, result, 120,255,THRESH_BINARY);
namedWindow("binary picture");
imshow("binary picture", result);
}
//对数变换
void logTransfer(Mat &gray){
Mat srcImage(gray);
Mat dstImage(srcImage.size(),srcImage.type());
//计算1+r
add(gray, Scalar(8), srcImage);
//转换为浮点数
srcImage.convertTo(srcImage, CV_64F);
//计算log(1+r) log:第一个参数为输入图像,第二个参数为得到的对数值
log(srcImage,dstImage);
dstImage=1*dstImage;
//归一化处理
normalize(dstImage,dstImage,0,255,NORM_MINMAX);
convertScaleAbs(dstImage, dstImage);
imshow("dstpicture", dstImage);
}
//伽马变换
void gammaTranfer(Mat &gray){
//gamma值,随着值不同图片呈现出不同的效果
double gamma=0.5;
Mat grayImg;
gray.convertTo(grayImg, CV_64F,1.0/255,0);
Mat gammaImg;
pow(grayImg, gamma,gammaImg);
gammaImg.convertTo(gammaImg, CV_8U,255,0);
imshow("gammapicture", gammaImg);
}
//彩色图像变换
void colorTransfer(Mat &image){
Mat colorpicture;
image.copyTo(colorpicture);
//HSV
Mat hsvImg;
cvtColor(image,hsvImg, COLOR_BGR2HSV);
std::vector<Mat> hsv;
split(hsvImg, hsv);
hsv[0]=(Scalar::all(180)-hsv[0]);
merge(hsv, colorpicture);
imshow("HSV_picture", colorpicture);
//RGB
colorpicture=Scalar::all(255)-image;
imshow("RBG_picture", colorpicture);
}
//处理为灰度图像
void grayShow(Mat &image){
Mat gray;
cvtColor(image, gray, COLOR_RGBA2GRAY);
namedWindow("gray picture");
imshow("gray picture", gray);
//Threshold(gray);
//logTransfer(gray);
gammaTranfer(gray);
}
int main(int argc, char** argv) {
//读取图像
Mat image;
image = imread("/Users/Admin/Desktop/myProject/1.jpg", 1);
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", image);
//grayShow(image);
colorTransfer(image);
waitKey(0);
return 0;
}