python - python np数组在opencv / opencvsharp中等效
问题描述
我正在尝试将以下 python def 'preproc_img' 转换为等效的 opencvsharp
def compute_norm_mat(base_width, base_height):
# normalization matrix used in image pre-processing
x = np.arange(base_width)
y = np.arange(base_height)
X, Y = np.meshgrid(x, y)
X = X.flatten()
Y = Y.flatten()
A = np.array([X*0+1, X, Y]).T
A_pinv = np.linalg.pinv(A)
return A, A_pinv
def preproc_img(img, A, A_pinv):
# compute image histogram
img_flat = img.flatten()
img_hist = np.bincount(img_flat, minlength = 256)
# cumulative distribution function
cdf = img_hist.cumsum()
cdf = cdf * (2.0 / cdf[-1]) - 1.0 # normalize
# histogram equalization
img_eq = cdf[img_flat]
diff = img_eq - np.dot(A, np.dot(A_pinv, img_eq))
# after plane fitting, the mean of diff is already 0
std = np.sqrt(np.dot(diff,diff)/diff.size)
if std > 1e-6:
diff = diff/std
return diff.reshape(img.shape)
在 opencv 或 opencvsharp 中对应的对象是什么?A 和 A_pinv 使用 compute_norm_mat 计算。
我被困在:
private void preproc_img(Mat faceMat)
{
Cv2.EqualizeHist(faceMat, faceMat);
}
解决方案
我不确定这是否正确,但这是我的第一次尝试。
private Mat preproc_img(Mat faceMat)
{
MatOfFloat hist = new MatOfFloat();
Cv2.CalcHist(new[] { faceMat }, new[] { 0 }, null, hist, 1, new[] { 256 }, new float[][] { new float[] { 0, 256 } });
Mat cdf = cumsum(hist);
cdf = cdf * (2.0 / cdf.At<float>(cdf.Rows - 1, 0)) - 1.0; // normalize
var cdfidx = cdf.GetGenericIndexer<float>();
Mat img_eq = EqualizeHist(faceMat, cdfidx);
Mat diff = (img_eq.Reshape(0, 64 * 64) - (A * (A_pinv * img_eq.Reshape(0, 64 * 64))));
var std = Math.Sqrt(diff.Dot(diff) / 64 / 64);
if (std > 1e-6)
diff = diff / std;
return diff.Reshape(0, 64);
}
private static Mat EqualizeHist(Mat faceMat, Mat.Indexer<float> cdfidx)
{
var img_eq = new Mat();
faceMat.ConvertTo(img_eq, MatType.CV_32FC1);
var idx = img_eq.GetGenericIndexer<float>();
for (var r = 0; r < img_eq.Rows; r++)
{
for (var c = 0; c < img_eq.Cols; c++)
{
idx[r, c] = cdfidx[(int)idx[r, c], 0];
}
}
return img_eq;
}
private static MatOfFloat cumsum(MatOfFloat hist)
{
var cdf = hist.Clone();
var indexer = cdf.GetIndexer();
var cumsum = 0.0f;
for (var i = 0; i < hist.Rows; i++)
{
cumsum += indexer[i, 0];
indexer[i,0] = cumsum;
}
return cdf;
}
public void initializeA()
{
MatOfInt X = new MatOfInt();
MatOfInt Y = new MatOfInt();
meshgrid(new MatOfInt(new int[] {1,64 },Enumerable.Range(0,64).ToArray()), new MatOfInt(new int[] { 1, 64 }, Enumerable.Range(0, 64).ToArray()), X, Y);
X = X.Reshape(1);
Y = Y.Reshape(1);
Console.WriteLine(X);
Console.WriteLine(Y);
A = new Mat();
A.PushBack(Mat.Ones(1, X.Cols,MatType.CV_32SC1));
A.PushBack(X);
A.PushBack(Y);
A = A.T();
A_pinv = A.Clone();
A.ConvertTo(A, MatType.CV_32FC1);
Cv2.Invert(A, A_pinv,DecompTypes.SVD);
}
推荐阅读
- sqlite - 将数据插入 SQLite 数据库失败并出现 sqlite3.InterfaceError: Error binding parameter 0 - 可能是不受支持的类型
- django - 两个字段之间的唯一约束,无论顺序如何
- google-apps-script - 如何制作电子表格副本并将其保存到指定文件夹?
- fastapi - 没有开始响应就返回了 ASGI 可调用对象
- assembly - NASM 汇编代码以前可以工作,但现在不行,并且正在丢弃分段错误
- design-patterns - 设计用于重复调度数百万个任务
- python - 我应该为 python 爬虫使用无限循环还是 cron 作业?
- python - 尝试在不打开和显示窗口python的情况下录制网络摄像头视频
- python - Python“with”语句在 Visual Studio 中导致错误
- php - 我想为每篇文章添加评论,所以在我的“foreach”循环中,我为每篇文章添加了评论,但“设置评论”功能适用于所有艺术作品