軟件測(cè)試自學(xué)網(wǎng)站考證培訓(xùn)機(jī)構(gòu)報(bào)名網(wǎng)站
圖像裁剪、調(diào)整大小、旋轉(zhuǎn)、透視圖像處理基本操作。
- croppedImage?圖像裁剪
- Cv2.Resize() 調(diào)整圖像大小
- 圖像旋轉(zhuǎn)
- Cv2.Rotate()旋轉(zhuǎn)
- Cv2.Flip()翻轉(zhuǎn)
- Cv2.WarpAffine()任意角度旋轉(zhuǎn)
- Cv2.GetAffineTransform()透視
一、圖像裁剪
// 讀取原始圖像
Mat image = new Mat("1.png", ImreadModes.Color);
// 設(shè)置感興趣區(qū)域的坐標(biāo)和尺寸
Rect roi = new Rect(100, 100, 200, 200);//坐標(biāo) x,y 尺寸 長(zhǎng)寬
// 裁剪圖像
Mat croppedImage = new Mat(image, roi);
// 顯示圖片
Cv2.ImShow("image", image);
Cv2.ImShow("croppedImage", croppedImage);
二、調(diào)整圖像大小
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );
參數(shù)說(shuō)明
- src:輸入,原圖像,即待改變大小的圖像;
- dst:輸出,改變大小之后的圖像,這個(gè)圖像和原圖像具有相同的內(nèi)容,只是大小和原圖像不一樣而已;
- dsize:輸出圖像的大小。如果這個(gè)參數(shù)不為0,那么就代表將原圖像縮放到這個(gè)Size(width,height)指定的大小;如果這個(gè)參數(shù)為0,那么原圖像縮放之后的大小就要通過(guò)下面的公式來(lái)計(jì)算:
- ? ? ? ?dsize = Size(round(fx*src.cols), round(fy*src.rows))
- ? ? ? ?其中,fx和fy就是下面要說(shuō)的兩個(gè)參數(shù),是圖像width方向和height方向的縮放比例。
- fx:width方向的縮放比例,如果它是0,那么它就會(huì)按照(double)dsize.width/src.cols來(lái)計(jì)算;
- fy:height方向的縮放比例,如果它是0,那么它就會(huì)按照(double)dsize.height/src.rows來(lái)計(jì)算;
- interpolation:這個(gè)是指定插值的方式,圖像縮放之后,肯定像素要進(jìn)行重新計(jì)算的,就靠這個(gè)參數(shù)來(lái)指定重新計(jì)算像素的方式,有以下幾種:
- ? ? ? INTER_NEAREST - 最鄰近插值
- ? ? ? INTER_LINEAR - 雙線性插值,如果最后一個(gè)參數(shù)你不指定,默認(rèn)使用這種方法
- ? ? ? INTER_AREA -區(qū)域插值 resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- ? ? ? INTER_CUBIC - 4x4像素鄰域內(nèi)的雙立方插值
- ? ? ? INTER_LANCZOS4 - 8x8像素鄰域內(nèi)的Lanczos插值
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );Mat srcImage = new Mat("1.png", ImreadModes.Color);// 臨時(shí)變量和目標(biāo)圖的定義Mat dstImage1 = new Mat();Mat dstImage2 = new Mat();Mat dstImage3= new Mat();Mat dstImage4 = new Mat();//進(jìn)行尺寸調(diào)整操作Cv2.Resize(srcImage, dstImage1, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Rows / 2), (double)InterpolationFlags.Linear);Cv2.Resize(srcImage, dstImage2, new OpenCvSharp.Size(srcImage.Cols / 2, srcImage.Cols / 2), (double)InterpolationFlags.Area);Cv2.Resize(srcImage, dstImage3, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Cubic);Cv2.Resize(srcImage, dstImage4, new OpenCvSharp.Size(srcImage.Cols * 2, srcImage.Cols * 2), (double)InterpolationFlags.Linear);Cv2.ImShow("dstImage1", dstImage1);Cv2.ImShow("dstImage2", dstImage2);Cv2.ImShow("dstImage3", dstImage3);Cv2.ImShow("dstImage4", dstImage4);
OpenCV圖像縮放resize各種插值方式的比較
三、圖片旋轉(zhuǎn)
- 左旋轉(zhuǎn)90° Cv2.Rotate(src, dst, RotateFlags.Rotate90CounterClockwise);
- 右旋轉(zhuǎn)90° Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);
- 旋轉(zhuǎn)180°?Cv2.Rotate(src, dst, RotateFlags.Rotate180);
- 垂直翻轉(zhuǎn)?Cv2.Flip(src, dst, FlipMode.Y);
- 水平翻轉(zhuǎn)Cv2.Flip(src, dst, FlipMode.X);
using OpenCvSharp;
using System;class Program
{static void Main(){Mat src = new Mat("input.jpg", ImreadModes.Color);Mat dst = new Mat();Cv2.Rotate(src, dst, RotateFlags.Rotate90Clockwise);Cv2.ImShow("dst", dst);Cv2.WaitKey(0);}
}
6.任意角度旋轉(zhuǎn)
Cv2.WarpAffine(
? ? ? ? ?InputArray ? ? ?src, // 輸入圖像
? ? ? ? ?OutputArray dst, // 輸出圖像
? ? ? ? ?InputArray ? ? ?M, // 旋轉(zhuǎn)矩陣
? ? ? ? ?Size ? ? ? ? dsize, // 輸出圖像大小
? ? ? ? ?int ? flags = INTER_LINEAR, // 像素插值方式
? ? ? ? ?int ? borderMode = BORDER_CONSTANT, // 背景填充默認(rèn)為常量
? ? ? ? ?const Scalar & ? ? ? ?borderValue = Scalar() // 填充顏色默認(rèn)為黑色
)
using OpenCvSharp;Mat img = new Mat("1.png", ImreadModes.Grayscale);
Point2f center = new Point2f(img.Cols / 2f, img.Rows / 2f);
//使用了Cv2.GetRotationMatrix2D()函數(shù)構(gòu)建旋轉(zhuǎn)矩陣,然后使用Cv2.WarpAffine()函數(shù)進(jìn)行仿射變換。
Mat matrix = Cv2.GetRotationMatrix2D(center, 45, 0.6);
Cv2.WarpAffine(img, img, matrix, img.Size());
Cv2.ImShow("img", img);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
7.圖像透視
Cv2.GetAffineTransform(srcPoints, dstPoints);
參數(shù)
src: 代表輸入圖像的三個(gè)點(diǎn)坐標(biāo), 形為:[[col_1, row_1], [col_2, row_2], [col_3, row_3]]
dst: 代表輸出圖像的三個(gè)點(diǎn)坐標(biāo), 形為:[[col_4, row_4], [col_5, row_5], [col_6, row_6]]
點(diǎn)1 由位置 [col_1, row_1] 移動(dòng)到 [col_4, row_4]
點(diǎn)2 由位置 [col_2, row_2] 移動(dòng)到 [col_5, row_5]
點(diǎn)3 由位置 [col_3, row_3] 移動(dòng)到 [col_6, row_6]
由這3個(gè)點(diǎn)的位置變化,可以得到 變化矩陣 M
————————————————
版權(quán)聲明:本文為CSDN博主「Enzo 想砸電腦」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_37804469/article/details/112304112
using OpenCvSharp;Mat src = new Mat("input.jpg", ImreadModes.Color);
Mat dst = new Mat();Point2f[] srcPoints = new Point2f[]
{new Point2f(0, 0),new Point2f(src.Cols, 0),new Point2f(0, src.Rows)
};Point2f[] dstPoints = new Point2f[]
{new Point2f(src.Cols * 0.0f, src.Rows * 0.33f),new Point2f(src.Cols * 0.85f, src.Rows * 0.25f),new Point2f(src.Cols * 0.15f, src.Rows * 0.7f)
};Mat affineMatrix = Cv2.GetAffineTransform(srcPoints, dstPoints);
Cv2.WarpAffine(src, dst, affineMatrix, src.Size());Cv2.ImShow("src", src);
Cv2.ImShow("dst", dst);
Cv2.WaitKey();
?
c# OpenCV 圖像裁剪、調(diào)整大小、旋轉(zhuǎn)、透視(三)?
c#OpenCV 讀取、顯示和寫(xiě)入圖像(二)
c# OpenCV安裝(一)?