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;

}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值