前言
准备11月份更一个新的系列,之前看的杨淑莹老师的《数字图像处理Visual Studio C 技术实现》,里面的代码都没来得及打,而且其是基于自定义的图像类实现的,这个系列就把所有例程移植为opencv-C 实现,也就是算法逻辑用C 实现,图像对象使用opencv自带的图像类。
该书在B站有配套教程,是天津理工大学杨淑莹老师的公开课,直接搜就行。
所以此系列不详细讲原理,只放基本思路 代码 运行效果,详细原理可以看书,我就不复述书的内容了。
图像扫描显示
向下扫描就是对图像进行分块并延时显示。
可以通过不断的改变显示的roi区域来达到扫描的效果:
代码语言:javascript复制void scanning_down()
{
//读取图片
Mat srcImage, dstImage;
srcImage = imread("2.jpg");
imshow("原图", srcImage);
//定义变量
Mat roiImage;
int ImageHeigth = srcImage.rows;
int ImageWidth = srcImage.cols;
namedWindow("向下扫描");
for (int i = 1; i < ImageHeigth; i ) {//步长为1
roiImage = srcImage(Rect(0, 0, ImageWidth, i));
roiImage.copyTo(dstImage);
imshow("向下扫描", dstImage);
waitKey(5);
}
waitKey(0);
}
动图
向上,向左,向右扫描显示同理。
图像渐显
图像渐显思路是先记录下图像每个像素点的像素值,显示的时候先将屏幕置黑,将循环显示图像n次,n依次为0,1,2,...,256。每一次显示像素值的n/256倍,从而达到渐显的效果。
代码语言:javascript复制void fade_in()//淡入
{
//读取图片
Mat srcImage, dstImage;
srcImage = imread("2.jpg");
dstImage = srcImage.clone();
imshow("原图", srcImage);
//定义变量
Mat roiImage;
int ImageHeigth = srcImage.rows;
int ImageWidth = srcImage.cols * 3;
namedWindow("图像渐显");
for (int n = 1; n < 256; n ) {
for (int i = 0; i < ImageHeigth; i ) {
uchar* data1 = srcImage.ptr<uchar>(i);
uchar* data2 = dstImage.ptr<uchar>(i);
for (int j = 0; j < ImageWidth; j ) {
data2[j] = data1[j] * n / 256;
}
}
imshow("图像渐显", dstImage);
waitKey(10);
}
}
动图
马赛克显示
马赛克显示是将图片分为固定大小的小块,并记录下所有小块的左上角坐标,然后随机将这些小块显示出来,就是马赛克效果。
代码语言:javascript复制//图像马赛克显示
void mosaic()
{
//读取图片
Mat srcImage, dstImage;
srcImage = imread("2.jpg");
dstImage = Mat(srcImage.size(), CV_8UC3);
imshow("原图", srcImage);
//定义变量
Mat roiImage;
int ImageHeigth = srcImage.rows;
int ImageWidth = srcImage.cols;
namedWindow("图像马赛克显示");
//存储每个小块的首地址并随机打乱
int step =24;//定义马赛克边长(正方形)
vector<Point2d> temp;
unsigned int mi = 0;
//for循环存储所有节点坐标
for (int x = 0; x < ImageWidth; x = x step) {
for (int y = 0; y < ImageHeigth; y = y step) {
if (x > ImageWidth - step) {
x = ImageWidth - step;
}
if (y > ImageHeigth - step) {
y = ImageHeigth - step;
}
temp.push_back(Point2d(x,y));
mi ;
}
}
random_shuffle(temp.begin(), temp.end());//打乱容器内元素
//for循环显示每个随机马赛克
for (int i = 0; i < mi; i ) {
srcImage(Rect(temp[i].x, temp[i].y, step, step)).copyTo(dstImage(Rect(temp[i].x, temp[i].y, step, step)));
imshow("图像马赛克显示", dstImage);
waitKey(1);
}
waitKey(0);
}
动图
THE END
今天就到这里啦。明天更新图像平移,交叉飞入,中间扩张,栅条特效,百叶窗特效这几个图像显示效果。