基于OpenCV与MFC的数字图像处理
1.灰度化与二值化
//读取原图
Mat img;
img = imread("../Leana.png");
//灰度化
Mat img_gray = Mat::zeros(img.size(), CV_8UC1);
//对每个像素点进行处理,I=0.3B+0.59G+0.11R
int rowNumber = img.rows;
int colNumber = img.cols;
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
img_gray.at<uchar>(i, j) = (img.at<Vec3b>(i, j)[0]*0.30 + img.at<Vec3b>(i, j)[1]*0.59+ img.at<Vec3b>(i, j)[2] * 0.11+0.5);
}
//cvtColor(img.clone(), img_gray,COLOR_BGR2GRAY);//函数调用
//二值化
int threshold_value = 128; //阈值
Mat img_binaryzation = Mat::zeros(img_gray.size(), CV_8UC1);
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < colNumber; j++)
{
if (img_gray.at<unsigned char>(i, j) < threshold_value)
img_binaryzation.at<unsigned char>(i, j) = 0;
else
img_binaryzation.at<unsigned char>(i, j) = 255;
}
}
2.减采样
{
//读取图像
Mat img_gray;
img_gray = imread("../Leana.png");
//灰度化
cvtColor(img_gray, img_gray, COLOR_BGR2GRAY);
//减采样
Mat img_2,img_4,img_16,img_8;
//2倍
img_2=Downsampling(img_gray.clone(),2,1);
//4倍
img_4 = Downsampling(img_gray.clone(), 2, 2);
//8倍
img_8 = Downsampling(img_gray.clone(), 4, 2);
//16倍
img_16 = Downsampling(img_gray.clone(), 4, 4);
}
/* 对图像进行降采样 */
Mat CImageProcessingDlg::Downsampling(Mat &mat, int multiple_x=1, int multiple_y=1)
{
int rows = mat.rows;
int cols = mat.cols;
Mat DownSamplingImg = Mat(rows/ multiple_x, cols/ multiple_y, CV_8UC1);//采样后结果
for (int i = 0, c =0; i < rows- multiple_x+1; i+= multiple_x,c++)
{
for (int j = 0,d=0; j < cols- multiple_y+1; j+= multiple_y,d++)
{
DownSamplingImg.at<uchar>(c, d) = mat.at<uchar>(i,j);
}
}
return DownSamplingImg;
}
3.效果图
更多源码请点此处