- 加盐
void MainWindow::salt(cv::Mat &image, int n)
{
std::default_random_engine e(time(0));
std::uniform_int_distribution<int> u1(0, image.rows);
std::uniform_int_distribution<int> u2(0, image.cols);
for(int k = 0; k < n; k++){
int i = u1(e), j = u2(e);
if(image.channels() == 1) //单通道
{
//image.at<uchar>(i, j) = 255;
//还可以这样写
cv::Mat_<uchar> im2 = image;
im2(i, j) = 255;
}
else if(image.channels() == 3) //三通道
{
// image.at<cv::Vec3b>(i, j)[0] = 255; // 还有二维和思维元素向量类型,cv::Vec2b和cv::Vec4b
// image.at<cv::Vec3b>(i, j)[1] = 255;
// image.at<cv::Vec3b>(i, j)[2] = 255;
//这样写
cv::Mat_<cv::Vec3b> im2 = image;
im2(i, j)[0] = 255;
im2(i, j)[1] = 255;
im2(i, j)[2] = 255;
}
}
}
减少图像中颜色数目
void MainWindow::colorReduce(const cv::Mat &image, cv::Mat &result, int div)
{
int n = image.rows;
int m = image.cols;
if(image.isContinuous()) //图像是否连续?
{
//没有对图像进行填补
m = n * m;
n = 1;
}
int op = static_cast<int>(log2(div * 1.0));
uchar mask = 0xFF << op;
for(int i = 0; i < n; i++)
{
const uchar *data = image.ptr<uchar>(i); //行首指针
uchar *res = result.ptr<uchar>(i);
for(int j = 0; j < m; j++)
{
//处理每个像素
*res++ = ((*data++)&mask) + div / 2;
*res++ = ((*data++)&mask) + div / 2;
*res++ = ((*data++)&mask) + div / 2;
}
}
}
用拉普拉斯算子锐化
void MainWindow::sharpen2D(const cv::Mat &image, cv::Mat &result)
{
//构造核(init 0)
cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));
kernel.at<float>(1, 1) = 5.0;
kernel.at<float>(0, 1) = -1.0;
kernel.at<float>(2, 1) = -1.0;
kernel.at<float>(1, 0) = -1.0;
kernel.at<float>(1, 2) = -1.0;
cv::filter2D(image, result, image.depth(), kernel);
}
cv::Mat
转QImage
QImage *result;
result = new QImage((const uchar*)image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
图像直方图
cv::MatND Histogram1D::getHistogram(const cv::Mat &image)
{
cv::MatND hist;
cv::calcHist(&image,
1, //计算单张图像的直方图
channels, //通道数量
cv::Mat(), //不使用掩码
hist, //返回的直方图
1, //1维
histSize, //项的数量
range//像素值的范围
);
qDebug()<<"zhifangtu\n";
for(int i= 0; i < 256; i++){
qDebug()<<i<<" "<<hist.at<float>(i)<<endl;
}
return hist;
}
cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image)
{
cv::MatND hist = getHistogram(image);
double maxVal = 0, minVal = 0;
cv::minMaxLoc(hist, &minVal, &maxVal, 0, 0);
cv::Mat histImg(histSize[0], histSize[0], CV_8U, cv::Scalar(255));
int hpt = static_cast<int>(0.9 * histSize[0]);
for(int i = 0; i < histSize[0]; i++)
{
float binVal = hist.at<float>(i);
int intensity = static_cast<int>(binVal * hpt / maxVal);
cv::line(histImg,
cv::Point(i, histSize[0]),
cv::Point(i, histSize[0]-intensity),
cv::Scalar::all(0));
}
return histImg;
}