OpenCV第七发:图像像素处理实现Halcon算子
在这里我觉得图像处理也就是像素处理,像素处理也就是数学计算,我觉得应该多看看Halcon的帮助文档。多看帮助,多学英语。
如:emphasize这个算子,Halcon的帮助文档直接给出了计算方法。
又如:rgb1_to_gray这个将GBR彩色图像如何转换成灰度图像也就计算公式
#include <iostream>
#include <string>
#include <thread>
#include <math.h>
#include <Windows.h>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
Mat srcImage = imread("D:/opencv/Img01.jpg");
Mat OutPutImg;
//Mat OutPutImg = Mat::zeros(srcImage.size(), srcImage.type());
if (!srcImage.data) {
printf("骚年:你应该继续查找你的文件路径是什么??或者你电脑是否需要换新的。");
return -1;
}
//if (srcImage.empty()) {//如果图像为空则返回 false
// printf("如果图像为空则返回 false");
// return -1;
//}
//imshow("源图像", srcImage);
OutPutImg = Mat::zeros(srcImage.size(), srcImage.type());
int H = srcImage.rows;
int W = srcImage.cols;
int channal = srcImage.channels();
Mat tmpM;
srcImage.convertTo(tmpM,CV_32F);
float alpha = 0.2;
float bate = 0.4;
//二话不说先来两个for循环
for (int row = 0; row < H; row++) {
for (int col = 0; col < W; col++) {
if (channal == 1)
{
float GrayPXI = srcImage.at<uchar>(row, col);
//将每个像素值用255减去,则会重置每一个像素值。
//如 5 = 255-250 250 = 255-5
OutPutImg.at<uchar>(row, col) = saturate_cast<uchar>(GrayPXI*alpha+ bate);
}
else if (channal == 3) {
//读取像素值
float BB = srcImage.at<Vec3b>(row, col)[0];
float GG = srcImage.at<Vec3b>(row, col)[1];
float RR = srcImage.at<Vec3b>(row, col)[2];
//重置像素值
OutPutImg.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(BB*alpha + bate);
OutPutImg.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(GG*alpha + bate);
OutPutImg.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(RR*alpha + bate);
//关于Vec3f 或者Vec3b 请按F12查看源代码解释
//在3通道RGB图像中,计算机储存结构为BGR,我们都知道,图像在计算机中实际上是以数组或者说矩阵形式储存
//在单通道图像中,图像的第一个像素值就是 [0]的所对应的值,
//例如 2*2 的 1 通道图像储存结构:
//{[Gray],[Gray]
//[Gray],[Gray]}
//但是在3通道图像中图像的 [0]储存结构是 [0]= {B,G,R}
//例如 2*2 的 3 通道图像储存结构:
//{[B,G,R],[B,G,R]
//[B,G,R],[B,G,R]}
//则这个 2*2 图像的3通道图像的列宽为 2*3=6 具体请查看相关的 《数字图像处理书籍》
//因此我们想要的到3通道第一个像素值B时候则应该 :
//int BB = src.at<Vec3b>(row, col)[0];
//对应的:
//int GG = src.at<Vec3b>(row, col)[1];
//int RR = src.at<Vec3b>(row, col)[2];
}
}
}
imshow("输出图像", OutPutImg);
imshow("源图像", srcImage);
//cout << endl;
//system("pause");
waitKey(0);
return 0;
}