1.图像的灰度化
相关API:
注:
1.API实现的功能:converts image from one color space to another
2.RGB图像的灰度化只是这个API功能的一部分;
3.更多功能实现请参考博客:学习opencv之cvtColor
实验代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
char *in_window_title = "Src image Window";
char *out_window_title = "Gray image Window";
Mat img = imread("E:/girl.jpg");//从指定路径加载图像,注意在Windows下要将路径中的"\"修改为"/"
if (!img.data)//加载图像失败
{
printf("Fault to load image!\n\r");
return -1;
}
imshow(in_window_title, img);//显示原图像
Mat img_gray;
cvtColor(img, img_gray, CV_BGR2GRAY);//讲原图像转换为灰度图
imshow(out_window_title, img_gray);//显示灰度图
waitKey(0);
return 0;
}
运行结果:
2.图像的二值化
2.1一般方法
相关API:
参数说明:
二值化的类型主要有以下几种方式:
cv::THRESH_OTSU(俗称 大津法)
这种方法是通过求取类间方差最小来确定分割阈值;
关于大津法参考博客:https://blog.csdn.net/weixin_40647819/article/details/90179953
图示:
实验参考代码:
...
Mat img_bin;
threshold(img_gray, img_bin, 125, 255, THRESH_BINARY);//将灰度图二值化,阈值设置为125,采用THRESH_BINARY方式二值化
imshow("Binary image Window", img_bin);//显示二值化图像
...
运行结果:
反二值化1:
bitwise_not(img_bin, img_bin);
反二值化2:
threshold(img_gray, img_bin, 125, 255, THRESH_BINARY_INV);
反二值化图像的效果:
当然也可以直接将RGB彩色图像直接二值化(如下图),像一幅油画,还是挺漂亮的,不过大多时候都是对灰度图进行的操作;
2.2自适应阈值分割:
相关API
自适应分割效果图:
3.像素的读写
3.1实验代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
char *in_window_title = "Src image Window";
char *out_window_title = "Bin image Window";
Mat img = imread("E:/color.jpg");//从指定路径加载图像,注意在Windows下要将路径中的"\"修改为"/"
if (!img.data)//加载图像失败
{
printf("Fault to load image!\n\r");
return -1;
}
imshow(in_window_title, img);//显示原图像
int width = img.cols;
int height = img.rows;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
if (img.channels() == 1)//原图像为单通道
{
uchar gray = img.at<uchar>(row, col);//单通道像素的读取
if (gray>125)img.at<uchar>(row, col) = 255;//单通道像素的修改
else img.at<uchar>(row, col) = 0;
}
else if (img.channels() == 3)//原图像为三通道
{
//读取8位RGB图像三个通道的值
uchar b = img.at<Vec3b>(row, col)[0];
uchar g = img.at<Vec3b>(row, col)[1];
uchar r = img.at<Vec3b>(row, col)[2];
//根据相应条件,修改蓝色区域的三通道值,使蓝色变为红色
if (b>150 && g < 240 && r < 240)
{
img.at<Vec3b>(row, col)[0] = 0;
img.at<Vec3b>(row, col)[1] = 0;
img.at<Vec3b>(row, col)[2] = 255;
}
}
}
}
imshow(out_window_title, img);//显示像素值修改后的图像
waitKey(0);
return 0;
}
3.2实验结果
输入为8位彩色图像时的运行结果:
毛刺比较多,顺便再进行一下中值滤波:
medianBlur(img, fil, 5);
中值滤波后的效果如下图: