我正在研究预训练的 vgg16 模型,因为我需要将图像文件的输入大小设置为 (224,224,3)。
我正在处理的代码是:
from tensorflow.keras.preprocessing import image
import cv2
import matplotlib.pyplot as plt
img = image.load_img('abc.jpg',target_size=(224,224))
img = image.img_to_array(img)
print(img.shape)
## output : (224,224,3)
img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#plt.imshow(img_grey)
th3 = cv2.adaptiveThreshold(img_grey,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
plt.figure(figsize=(20,10))
plt.imshow(th3)
Run Code Online (Sandbox Code Playgroud)
error Traceback (most recent call last)
<ipython-input-88-2a8a27b965ed> in <module>
17 #plt.imshow(img_grey)
18
---> 19 th3 = cv2.adaptiveThreshold(img_grey,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
20 plt.figure(figsize=(20,10))
21 plt.imshow(th3)
error: OpenCV(4.1.0) /io/opencv/modules/imgproc/src/thresh.cpp:1627: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'adaptiveThreshold'
Run Code Online (Sandbox Code Playgroud)
帮助我解决问题。
我目前正致力于实现一个名为的阈值算法Bradley Adaptive Thresholding.
我一直在主要关注两个链接,以便弄清楚如何实现这个算法.我也成功地实现了另外两种阈值算法,主要是Otsu的方法和平衡直方图阈值处理.
以下是我为了创建Bradley Adaptive Thresholding算法而遵循的两个链接.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.420.7883&rep=rep1&type=pdf
以下是Python我运行算法并保存图像的源代码部分.我使用Python Imaging Library而不是其他工具来完成我想要做的事情.
def get_bradley_binary(inp_im):
w, h = inp_im.size
s, t = (w / 8, 0.15)
int_im = Image.new('L', (w, h))
out_im = Image.new('L', (w, h))
for i in range(w):
summ = 0
for j in range(h):
index = j * w + i
summ += get_pixel_offs(inp_im, index)
if i == 0:
set_pixel_offs(int_im, index, summ)
else:
temp = get_pixel_offs(int_im, …Run Code Online (Sandbox Code Playgroud) 我正在寻找用于图像二值化的最佳自适应阈值方法.但我对黑暗和模糊的图像有任何问题.
输入图片:

当我使用自适应阈值方法时,我会收到此
输出图像:

这对我不好!
那么,有人可以帮我解决这个问题吗?
另一张图片: 
并且: 
第一个看起来非常糟糕的@ Hammer'solution(我必须选择c通道),第二个我可以使用自适应阈值正常.
所以我想为所有案例找到最佳解决方案.
再次感谢!
我已经进行了全面研究,以便找到在iOS上执行自适应阈值处理的内核.不幸的是,我不了解内核语言或其背后的逻辑.下面,我找到了一个执行阈值处理的例程(https://gist.github.com/xhruso00/a3f8a9c8ae7e33b8b23d)
static NSString * const kKernelSource = @"kernel vec4 thresholdKernel(sampler image)\n"
"{\n"
" float inputThreshold = 0.05;\n"
" float pass = 1.0;\n"
" float fail = 0.0;\n"
" const vec4 vec_Y = vec4( 0.299, 0.587, 0.114, 0.0 );\n"
" vec4 src = unpremultiply( sample(image, samplerCoord(image)) );\n"
" float Y = dot( src, vec_Y );\n"
" src.rgb = vec3( compare( Y - inputThreshold, fail, pass));\n"
" return premultiply(src);\n"
"}";
Run Code Online (Sandbox Code Playgroud)
是否有可能将其重写为自适应阈值内核?我提供给它的图像已经变成B&W并且已经模糊了.你能指点我的资源吗?我想坚持使用CoreImage,因为我的整个堆栈是围绕它构建的.
编辑:我想要实现的最佳示例/参考已在GPUImage的GPUImageAdaptiveThresholdFilter中实现 - https://github.com/BradLarson/GPUImage/blob/c5f0914152419437869c35e29858773b1a06083c/framework/Source/GPUImageAdaptiveThresholdFilter.m
我试图使用这两种方法,但似乎自适应阈值似乎给出了更好的结果.我用了
cvSmooth( temp, dst,CV_GAUSSIAN,9,9, 0);
Run Code Online (Sandbox Code Playgroud)
在原始图像上然后我只使用了阈值.
有没有什么我可以用Otsu方法调整,以使图像更好像自适应阈值?还有一件事,侧面有一些不需要的指纹残留,任何想法我怎么能把它们丢弃?
我从期刊上读到,通过比较自定义方块中白色像素的百分比,我可以获得投资回报率.然而,这种方法要求我有一个阈值,可以使用OTSU方法找到,但我不太确定AdaptiveThresholding.
cvAdaptiveThreshold( temp, dst, 255,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY,13, 1 );
Run Code Online (Sandbox Code Playgroud)
结果:


cvThreshold(temp, dst, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)

我正在开发一个项目,需要准确的OCR结果,用于具有丰富背景的图像.所以我比较两个OCR(其中一个是Tesseract)的结果来做出我的选择.关键是结果受到预处理步骤的强烈影响,尤其是图像二值化.我提取了另一个OCR的二值化图像并将其传递给Tesseract,使Tesseract的结果增强了30-40%.
我有两个问题,你的答案对我有很大帮助:
提前致谢 :)
我正在寻找一种类似自适应阈值的算法,但它保持颜色.我正在尝试拍这样的图像:

并使它看起来像这样:

如果重要的话,我在ios工作.
image-processing core-image gpuimage imagefilter adaptive-threshold
我对图像处理非常业余。我可以成功地进行正常阈值处理,但是我在自适应阈值处理中遇到了错误。这是我的代码:
import cv2
import numpy as np
img = cv2.imread("vehicle004.jpg")
img = cv2.medianBlur(img,5)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_,th2=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
cv2.imshow("window2",th2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
错误信息:
line 7, in <module>
_,th2 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。
我需要将一些图像转换为二进制文件以进行OCR.
以下是我正在使用的功能:
Mat binarize(Mat & Img, Mat& res, float blocksize, bool inverse)
{
Img.convertTo(Img,CV_32FC1,1.0/255.0);
CalcBlockMeanVariance(Img,res, blocksize, inverse);
res=1.0-res;
res=Img+res;
if (inverse) {
cv::threshold(res,res,0.85,1,cv::THRESH_BINARY_INV);
} else {
cv::threshold(res,res,0.85,1,cv::THRESH_BINARY);
}
cv::resize(res,res,cv::Size(res.cols/2,res.rows/2));
return res;
}
Run Code Online (Sandbox Code Playgroud)
地点CalcBlockMeanVariance:
void CalcBlockMeanVariance(Mat& Img,Mat& Res,float blockSide, bool inverse) //21 blockSide - the parameter (set greater for larger font on image)
{
Mat I;
Img.convertTo(I,CV_32FC1);
Res=Mat::zeros(Img.rows/blockSide,Img.cols/blockSide,CV_32FC1);
Mat inpaintmask;
Mat patch;
Mat smallImg;
Scalar m,s;
for(int i=0;i<Img.rows-blockSide;i+=blockSide)
{
for (int j=0;j<Img.cols-blockSide;j+=blockSide)
{
patch=I(Range(i,i+blockSide+1),Range(j,j+blockSide+1));
cv::meanStdDev(patch,m,s);
if(s[0]>0.01) // Thresholding parameter …Run Code Online (Sandbox Code Playgroud) 我是人工神经网络的新手,但请帮我解决这个问题?
我正在尝试实现一个用于字符识别的人工神经网络(使用 MLP 和 SNN),我是否需要在输出层中具有与需要识别的字符数相同数量的神经元。例如,如果我希望我的网络能够识别大写字母、小写字母和数字,我是否需要在输出层有 26+26+10 个神经元。
如果我必须识别 Unicode 字符集中的所有字符,我需要输出层中有多少个神经元。
是否有任何方法(动态阈值)来减少这个数字或在输出层动态添加神经元?
如果可能,请提供研究文章的链接。谢谢。
opencv ×5
python ×3
c++ ×2
core-image ×2
binary-data ×1
cifilter ×1
cikernel ×1
gpuimage ×1
imagefilter ×1
ios ×1
keras ×1
ocr ×1
roi ×1
tesseract ×1
threshold ×1